Геолокация Google Maps Javascript V3 - не может получить доступ к переменной initialLocation, если не получено предупреждение - PullRequest
0 голосов
/ 19 марта 2011

приносим извинения, если на этот вопрос уже был дан ответ - я искал несколько часов в StackOverflow и в других местах и ​​не могу понять.

Я пытаюсь использовать функцию геолокации Google Maps V3 ( Google Maps Javascript API V3 - определение местоположения пользователя ), и он хотел добавить простой центральный маркер (среди прочего) после центрирования карты.

Если я добавлю следующее наконец функции «initialize», похоже, что он не имеет доступа к переменной «initialLocation»:

          var marker = new google.maps.Marker({
            position: initialLocation, 
            map: map
          });

Однако, если я предупреждаю initialLocation непосредственно перед этим, он работает.

Вот полный код, почти идентичный примеру Google:

    var initialLocation;
    var siberia = new google.maps.LatLng(60, 105);
    var newyork = new google.maps.LatLng(40.69847032728747, -73.9514422416687);
    var browserSupportFlag =  new Boolean();
    var map;
    var infowindow = new google.maps.InfoWindow();

    function initialize() {
      var myOptions = {
        zoom: 6,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

      // Try W3C Geolocation method (Preferred)
      if(navigator.geolocation) {
        browserSupportFlag = true;
        navigator.geolocation.getCurrentPosition(function(position) {
          initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
          contentString = "Location found using W3C standard";
          map.setCenter(initialLocation);
          infowindow.setContent(contentString);
          infowindow.setPosition(initialLocation);
          infowindow.open(map);
        }, function() {
          handleNoGeolocation(browserSupportFlag);
        });
      } else if (google.gears) {
        // Try Google Gears Geolocation
        browserSupportFlag = true;
        var geo = google.gears.factory.create('beta.geolocation');
        geo.getCurrentPosition(function(position) {
          initialLocation = new google.maps.LatLng(position.latitude,position.longitude);
          contentString = "Location found using Google Gears";
          map.setCenter(initialLocation);
          infowindow.setContent(contentString);
          infowindow.setPosition(initialLocation);
          infowindow.open(map);
        }, function() {
          handleNoGeolocation(browserSupportFlag);
        });
      } else {
        // Browser doesn't support Geolocation
        browserSupportFlag = false;
        handleNoGeolocation(browserSupportFlag);
      }

      //alert(initialLocation);

      var marker = new google.maps.Marker({
            position: initialLocation, 
            map: map
      });
    }

    function handleNoGeolocation(errorFlag) {
      if (errorFlag == true) {
        initialLocation = newyork;
        contentString = "Error: The Geolocation service failed.";
      } else {
        initialLocation = siberia;
        contentString = "Error: Your browser doesn't support geolocation. Are you in Siberia?";
      }
      map.setCenter(initialLocation);
      infowindow.setContent(contentString);
      infowindow.setPosition(initialLocation);
      infowindow.open(map);
    }

Выше не будет добавлять маркер, но если вы раскомментируете строку «alert (initialLocation);», она будет работать.

Почему это?Я подозреваю, что это вопрос области видимости, но я не уверен.

(Для моего приложения важно, чтобы переменная initialLocation была доступна вне блока "if (navigator.geolocation) {")

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 марта 2011

Проблема в том, что код не ждет, пока у него не появится местоположение, когда он пытается добавить ваш маркер.

добавьте код маркера сразу после установки initialLocation, и он будет работать.

1 голос
/ 19 марта 2011

Вызов getCurrentPosition () является асинхронным, что означает, что функция (), указанная вами в качестве параметра в вызове, будет выполняться после определения местоположения.Поэтому initialLocation не будет установлен немедленно, он будет установлен после вызова этих функций обратного вызова.

Что вам нужно сделать, это переместить

var marker = new google.maps.Marker({
            position: initialLocation, 
            map: map
      });

внутрь этой функции следующим образом.

navigator.geolocation.getCurrentPosition(function(position) {
          initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
          contentString = "Location found using W3C standard";
          map.setCenter(initialLocation);
          infowindow.setContent(contentString);
          infowindow.setPosition(initialLocation);
          infowindow.open(map);
          var marker = new google.maps.Marker({
            position: initialLocation, 
            map: map
          });
        }, function() {
          handleNoGeolocation(browserSupportFlag);
        });

Как видно из примера, они ничего не делают с initialLocation вне этих функций обратного вызова.

...