Javascript + Google Map: как получить геолокацию, а затем назначить центр карты?

Это, наверное, очень простой вопрос. У меня код работает, но он логически неверен.

Мне нужно найти геолокацию и установить там центр карты. Если я не могу получить доступ к геолокации, я хочу установить центр на New Heaven. Я знаю, что мне следует использовать обратные вызовы, но не знаю, как это сделать.

Прямо сейчас код работает, но работает медленно. Сначала он устанавливает центр на Новое небо, а затем переходит к реальной геолокации. Хочу сразу перейти к настоящему. Как мне этого добиться?

Спасибо.

$(document).ready(function() {

let canvas = $("#map-canvas").get(0);

// Styles for map
// https://developers.google.com/maps/documentation/javascript/styling
let styles = [
    // Hide Google's labels
    {
        featureType: "all",
        elementType: "labels",
        stylers: [
            {visibility: "off"}
        ]
    },
    // Hide roads
    {
        featureType: "road",
        elementType: "geometry",
        stylers: [
            {visibility: "off"}
        ]
    }
];
// Options for map
// https://developers.google.com/maps/documentation/javascript/reference#MapOptions
let options = {
    center: {lat: 41.3184, lng: -72.9318},//new heaven
    disableDefaultUI: true,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    maxZoom: 14,
    panControl: true,
    styles: styles,
    zoom: 13,
    zoomControl: true
};

// Instantiate map
map = new google.maps.Map(canvas, options);

//reset center if geolocation is accessible (HERE IS THE PROBLEM)
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
        pos = {
          lat: position.coords.latitude,
          lng: position.coords.longitude
        };
        map.setCenter(pos);
        var marker = new google.maps.Marker({
        position: map.getCenter(),
        map:map,
        label:"Around Me"
        });
    });
}

});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не хотите, чтобы он располагался в центре «New Heaven», не устанавливайте центр, пока обратный вызов геолокации не вернет значение. Недостатком этого является то, что в случае сбоя геолокации (пользователь отрицает это или браузер не поддерживает) карта вообще не отображается.

доказательство концепции скрипки

$(document).ready(function() {

  let canvas = $("#map-canvas").get(0);

  // Styles for map
  // https://developers.google.com/maps/documentation/javascript/styling
  let styles = [
    // Hide Google's labels
    {
      featureType: "all",
      elementType: "labels",
      stylers: [{
        visibility: "off"
      }]
    },
    // Hide roads
    {
      featureType: "road",
      elementType: "geometry",
      stylers: [{
        visibility: "off"
      }]
    }
  ];
  // Options for map
  // https://developers.google.com/maps/documentation/javascript/reference#MapOptions
  let options = {
    disableDefaultUI: true,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    maxZoom: 14,
    panControl: true,
    styles: styles,
    zoom: 13,
    zoomControl: true
  };

  // Instantiate map
  map = new google.maps.Map(canvas, options);

  //reset center if geolocation is accessible (HERE IS THE PROBLEM)
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
      pos = {
        lat: position.coords.latitude,
        lng: position.coords.longitude
      };
      map.setCenter(pos);
      var marker = new google.maps.Marker({
        position: map.getCenter(),
        map: map,
        label: "Around Me"
      });
    });
  }

});
html,
body,
#map-canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src = "https://maps.googleapis.com/maps/api/js"></script>
<div id = "map-canvas"></div>

Другие вопросы по теме