Нэн, загрузив данные с Geocoder

Я пробую использовать geocododer, чтобы превращать данные о почтовых индексах в координаты. instanciado функция два раза, чтобы отделять закладки (в loop for) и главном pinpoint. Как только была загружена стоимость всех координат, я пробую вычислять дистанцию между каждой закладкой и главным pinpoint.

Проблема состоит в том, что благодаря тому, что geocoder он загружает стоимость координат asíncronamente, он часто пробует делать конечную операцию, не загрузив каких-то из координат раньше, возвращая NaN.

Есть какой-то способ вынуждать в последнюю операцию, в которую он осуществляется однажды, были загружены все координаты?

Я оставляю вас с рукописным шрифтом.

<script>
    var map = new google.maps.Map(document.getElementById('map'), {
        scrollwheel: true,
        zoom: 14,
        disableDefaultUI: true,
        controls:false,
        styles: [{"featureType":"water","elementType":"geometry","stylers":[{"color":"#e9e9e9"},{"lightness":17}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":20}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#ffffff"},{"lightness":17}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#ffffff"},{"lightness":29},{"weight":0.2}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":18}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":16}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":21}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#dedede"},{"lightness":21}]},{"elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#ffffff"},{"lightness":16}]},{"elementType":"labels.text.fill","stylers":[{"saturation":36},{"color":"#333333"},{"lightness":40}]},{"elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#f2f2f2"},{"lightness":19}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#fefefe"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#fefefe"},{"lightness":17},{"weight":1.2}]}]
    });
    var geocoder = new google.maps.Geocoder;
    geocodeAddress(geocoder, map);


    function geocodeAddress(geocoder, resultsMap) {
        var event = $('.event-location').text();
        var siteLoc = new Array();
        var siteLocs = $('.campsite-loc');
        siteLocs.each(function() {
            var siteLocation = $(this).text();
            siteLoc.push(siteLocation); 
        });
        var eventLat;
        var eventLng;
        var siteLat;
        var siteLng;

        geocoder.geocode({'address': event}, function(results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
            resultsMap.setCenter(results[0].geometry.location);
            resultsMap.setZoom(15);
            var event = new google.maps.Marker({
                map: resultsMap,
                icon: '/assets/images/event.png',
                position: results[0].geometry.location
            });
            eventLat = results[0].geometry.location.lat();
            eventLng =  results[0].geometry.location.lng();
            } else {
            alert('Geocode was not successful for the following reason: ' + status);
            }

        });
        ffor (i=0; i < siteLoc.length; i++) {
        geocoder.geocode({'address': siteLoc[i]}, function(results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
                var site = new google.maps.Marker({
                    map: resultsMap,
                    icon: '/assets/images/site1.png',
                    position: results[0].geometry.location
                });
                siteLat = results[0].geometry.location.lat();
                siteLng = results[0].geometry.location.lng();
                var x = eventLat;
                var y = eventLng;
                console.log(x,y,siteLat,siteLng);
                var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(x,y), new google.maps.LatLng(siteLat,siteLng));
                var distanceKm = (distance/1000).toFixed(1);
                if (isNaN(distanceKm)) {
                    $('.distance-loc').text(0.3);
                } else {
                    $('.distance-loc').text(distanceKm);
                }
                $('.event-main-container').on('click',function() {
                    resultsMap.setCenter(results[0].geometry.location);
                });
            } else {
                alert('Geocode was not successful for the following reason: ' + status);
            }

        });
    }
    </script>

Спасибо за вашу помощь!!

3
задан 15.03.2016, 15:10
1 ответ

Проблема была бы в этой части цикла for:

var x = eventLat;
var y = eventLng;
console.log(x,y,siteLat,siteLng);
var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(x,y), new google.maps.LatLng(siteLat,siteLng));

как eventLat и eventLng они вычисляются для главного pinpoint асинхронной формы, мог бы встречаться случай, который, когда вычисляется дистанция для закладок, у этих переменных еще не было стоимости и поэтому появлялось как NaN.

Возможное решение: двинь цикл for внутри результата pinpoint. Таким образом ты убедишься, которого eventLat и eventLng уже они будут определены и у тебя не были бы должны бы быть проблемы:

geocoder.geocode({'address': event}, function(results, status) {
  if (status === google.maps.GeocoderStatus.OK) {
    resultsMap.setCenter(results[0].geometry.location);
    resultsMap.setZoom(15);
    var event = new google.maps.Marker({
      map: resultsMap,
      icon: '/assets/images/event.png',
      position: results[0].geometry.location
    });
    eventLat = results[0].geometry.location.lat();
    eventLng =  results[0].geometry.location.lng();
  } else {
    alert('Geocode was not successful for the following reason: ' + status);
  }

  // en este punto ya tienes los valores de eventLat y eventLng
  for (i=0; i < siteLoc.length; i++) {
    geocoder.geocode({'address': siteLoc[i]}, function(results, status) {
      if (status === google.maps.GeocoderStatus.OK) {
        var site = new google.maps.Marker({
          map: resultsMap,
          icon: '/assets/images/site1.png',
          position: results[0].geometry.location
        });
        siteLat = results[0].geometry.location.lat();
        siteLng = results[0].geometry.location.lng();
        var x = eventLat;
        var y = eventLng;
        console.log(x,y,siteLat,siteLng);
        var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(x,y), new google.maps.LatLng(siteLat,siteLng));
        var distanceKm = (distance/1000).toFixed(1);
        if (isNaN(distanceKm)) {
          $('.distance-loc').text(0.3);
        } else {
          $('.distance-loc').text(distanceKm);
        }
        $('.event-main-container').on('click',function() {
          resultsMap.setCenter(results[0].geometry.location);
        });
      } else {
        alert('Geocode was not successful for the following reason: ' + status);
      }

    });
  }

});

Недостаток этого решения состоит в том, что первая главная точка (pinpoint) заставит ждать всех остальных, чтобы быть показанными. Но способа или другой, они будут должны надеяться на то, что первый производится, чтобы вычислять дистанцию в любом случае.

1
ответ дан 24.11.2019, 14:44
  • 1
    Так как в конце концов это было этим. Большое спасибо Альваро. – David Cortes Nieto 16.03.2016, 21:17

Теги

Похожие вопросы