1

Я должен получить отформатированный адрес данных координат с помощью API Карт Google. Я использую Google Reverse Geo coding для поиска имени местоположения. Это отлично работает, когда есть имя, доступное для местоположения в базе данных карт Google.Найти ближайший из известных мест: Google Reverse Geocoding

В большинстве случаев данные координаты находятся вдали от городских границ (например, на шоссе). Функция возвращает ZERO_RESULTS, так как на карте не указано имя. Требование - найти ближайший известный адрес местонахождения, который будет возвращен.

Функционально это приятно слышать, но технически, как это сделать?

В настоящее время я нахожу местоположение, которое находится в нескольких километрах от этого места, проверяя, имеет ли место имя и рекурсивно идет, пока я не получу имя.

Лично не нравится этот подход, в силу следующих причин:

  1. не догадываетесь, в каком направлении идти, чтобы найти место, которое имеет название

  2. я мог бы пойти в направление, но известное место - всего несколько метров в обратном направлении.

  3. Я мог бы зайти слишком далеко во время приращения, так как в месте, где находится 15 км, есть имя. Я ищу название в 10 км от отеля и проверю на 20 км снова, так как приращение составляет 10 км.

Ниже приведен полный код, который работает, но с вышеуказанными проблемами.

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Map Test</title> 
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.1.min.js"></script> 
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script> 

</head> 
<body> 
    <span id="spanId">Loading...</span> 
    <script> 
     Number.prototype.toRad = function() { 
      return this * Math.PI/180; 
     } 

     Number.prototype.toDeg = function() { 
      return this * 180/Math.PI; 
     } 

     google.maps.LatLng.prototype.destinationPoint = function (brng, dist) { 
      dist = dist/6371; 
      brng = brng.toRad(); 

      var lat1 = this.lat().toRad(), lon1 = this.lng().toRad(); 

      var lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) + 
           Math.cos(lat1) * Math.sin(dist) * Math.cos(brng)); 

      var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) * 
             Math.cos(lat1), 
             Math.cos(dist) - Math.sin(lat1) * 
             Math.sin(lat2)); 

      if (isNaN(lat2) || isNaN(lon2)) return null; 

      return new google.maps.LatLng(lat2.toDeg(), lon2.toDeg()); 
     } 

     var pointA = new google.maps.LatLng(32.6811,74.8732); 

     getLocation(pointA); 
var distance = 0; 
     function getLocation(info) { 

      var myCenter = info; //new google.maps.LatLng(info.split(",", 3)[1], info.split(",", 3)[2]); 
      var gc = new google.maps.Geocoder(); 

      gc.geocode({ 'location': myCenter }, function (results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         document.getElementById('spanId').innerHTML = results[1].formatted_address + ', ' + distance + ' kms away from original point' ; 
        } else { 
         window.alert('No results found'); 
        } 
       } else { 
        if (status == 'ZERO_RESULTS') 
        { 
         var radiusInKm = 10; 
         distance += radiusInKm; 
         document.getElementById('spanId').innerHTML = 'Getting results from ' + distance + ' kms away'; 
         var pointB = pointA.destinationPoint(90, distance); 
         setTimeout(function(){ 
          getLocation(pointB); 
         }, 2000); 
        } 

       } 
      }); 
     } 


    </script> 
</body> 
</html> 

действительно понравится, если у кого-то будет хорошее решение.

JSFiddle Ссылка: https://jsfiddle.net/hbybs68q/1/

спасибо.

ответ

2

Вам необходимо изменить условие if внутри функции getLocation. Проверить результаты [0] не результат [1].

if (status == google.maps.GeocoderStatus.OK) { 
     if (results[0]) { 
      document.getElementById('spanId').innerHTML = results[0].formatted_address + ', ' + distance + ' kms away from original point' ; 
     } else { 
       window.alert('No results found'); 
     } 
} else { 
     window.alert('Geocoder failed due to - ' + status) 
} 
+0

статус сам показывает 'ZERO_RESULTS'. раздел результатов даже не выполняется. есть использование, изменяющее результаты [0] или результаты [1] –

+0

Вы пытаетесь щелкнуть где-нибудь в океанах? Потому что для океанических результатов [0] будет нулевым. ZERO_RESULTS – shreeramk

+0

Я пытаюсь щелкнуть по 32.6811,74.8732. См. Местоположение на [maps] (https://www.google.co.in/maps/@32.6811,74.8732,15z?hl=ru). Это где-то в штате Джамму и Кашмир в Индии. –

Смежные вопросы