Найти ближайшее известное местоположение: Обратное геокодирование Google

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

В большинстве случаев данные координаты находятся далеко от границ города (например, на шоссе). Функция возвращает 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/

благодаря.


person Lakshman Pilaka    schedule 07.08.2015    source источник


Ответы (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)
}
person Shreeram K    schedule 07.08.2015
comment
сам статус показывает ZERO_RESULTS. раздел результатов даже не выполняется. есть смысл изменить результаты [0] или результаты [1] - person Lakshman Pilaka; 07.08.2015
comment
Вы пытаетесь щелкнуть где-нибудь в океанах? Потому что для результатов океана [0] будет нуль, т.е. ZERO_RESULTS - person Shreeram K; 07.08.2015
comment
я пытаюсь нажать на 32.6811,74.8732. Посмотреть местоположение на [картах] (google.co.in /maps/@32.6811,74.8732,15z?hl=ru). Это где-то в штате Джамму и Кашмир в Индии. - person Lakshman Pilaka; 07.08.2015
comment
Я думаю, Google не нанес на карту эту область. В моем приложении я также получаю ZERO_RESULT за любой клик в Джамму и Кашмире. Я сообщу об этой ошибке в Google. - person Shreeram K; 07.08.2015
comment
@eugensunic, я добавил ссылку на скрипку... jsfiddle.net/hbybs68q/1 для вашего краткий справочник. - person Lakshman Pilaka; 07.08.2015
comment
@LakshmanPilaka, вы сами составили уравнения или скопировали их откуда-то? - person Eugen Sunic; 07.08.2015
comment
@eugensunic я использовал код из этого пост - person Lakshman Pilaka; 07.08.2015

ZERO_RESULTS из обратного геокодирования в Google Geocoding API обычно означают, что широта находится в водоеме далеко от берега (океанов, морей, очень больших озер и т. д.) или в районе с территориальный спор. Это известная проблема: https://code.google.com/p/gmaps-api-issues/issues/detail?id=8783

person miguev    schedule 14.07.2016