Синхронное геокодирование Google Maps API

Мне было интересно, возможно ли синхронно геокодировать что-то с помощью googlemaps api, поэтому вместо ожидания вызова функции обратного вызова он будет ждать возврата значения. Кто-нибудь нашел способ сделать что-то подобное.

P.S.: я использую версию 3 API


person giroy    schedule 21.08.2009    source источник


Ответы (3)


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

Чего именно вы пытаетесь достичь?

person Chris B    schedule 21.08.2009
comment
У меня есть форма, которая включает адрес. В рамках проверки данных формы я думал об использовании геокодера Google для проверки адреса. Мне также нужны значения широты и долготы для ввода в мою базу данных. Я знаю, что могу сделать это с помощью функции обратного вызова, но это похоже на хак и будет более сложным. - person giroy; 21.08.2009
comment
Геокодер полностью предназначен для использования с функцией обратного вызова. Не волнуйтесь, это не взлом. :) Это действительно ваш единственный вариант. Однако имейте в виду, что вы нарушите Условия обслуживания Google Maps, если будете использовать Geocoder, не отображая каким-либо образом результаты на карте Google. - person Chris B; 21.08.2009
comment
насколько я знаю, вы не можете использовать API Google во внутренней системе или с избранной аудиторией. Ваша страница, использующая Карты, должна быть открыта для всего Интернета — ознакомьтесь с условиями договора. Хорошо @B Крис @Chris B - person Paulo Henrique; 28.06.2010
comment
перестаньте говорить, что на самом деле нет никаких причин делать X. Всегда есть какая-то причина. В этом случае пользователь может уйти (с помощью кнопки отправки) до того, как геокодер ответит. - person GoTo; 13.06.2013
comment
@GoTo Нет причин полностью зависать в браузере. Если вам действительно нужно запретить им что-то делать во время ожидания обратного вызова, вы можете сделать это вручную. Пользователь по-прежнему должен иметь возможность прокручивать или получать доступ к другим функциям. - person Chris B; 13.06.2013
comment
@ChrisB Я согласен. Можно вручную заблокировать действия, требующие ответа от геокодера. А затем вручную тайм-аут, если геокодер не работает... - person GoTo; 25.09.2013

Да, то, чего вы пытаетесь добиться, возможно, хотя синхронный запрос не нужен.

Посмотрите на этот код

function StoreGeo()
 {
        var address =  $('input[name=zipcode]').val() + ', ' + $('input[name=city]').val();
 geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var ll = results[0].geometry.location.toString();

            llarr = ll.replace(/[\(\) ]/g, '').split(',');

                for(i = 0; i < llarr.length;i++)
                {
                    $('#form').append($('<input type="hidden" name="'+(i == 0 ? 'lat' : 'long')+'">').val(llarr[i]));
                }

                $('#form').submit();
      } 
      else
      {
        alert(status);
      }
    });

    $('#form').unbind('submit');
    return false;
 }

$(document).ready(function () { 

    //init maps
    geocoder = new google.maps.Geocoder();

    $('#form').bind('submit',function() {
        StoreGeo();
    });

}); 

Итак, прикрепите обработчик отправки к форме, когда она будет отправлена, выполните гео-запрос на основе информации об адресе из вашей формы. Но при этом отложить отправку, вернув false в обработчике. Обработчик ответа создаст 2 скрытых текстовых поля «широта» и «длина» и сохранит ответ. наконец, форма отправляется клиентским скриптом, включая два новых поля. На стороне сервера вы можете хранить их в БД.

!! Обратите внимание, что это возможно, но, вероятно, противоречит условиям Google, как указано выше.

person karremans    schedule 12.09.2010
comment
отличный ответ! Я бы добавил, что вы можете сделать гео-запрос, как только пользователь предоставит необходимую информацию (или через некоторое время после этого). Таким образом, пока он заполняет остальную часть формы, геокодер успевает отправить ответ. Вы будете делать больше таких гео-запросов, если пользователь продолжит менять свое мнение. - person GoTo; 13.06.2013
comment
Что касается терминов Google, я не думаю, что вы их нарушите, если просто сохраните ответы в базе данных. Практически любое веб-приложение, выходящее за рамки простого примера, потребует от вас хранить ответы в базе данных. Вы нарушаете их, если используете ответы без Google Maps или в закрытой/внутренней системе. - person GoTo; 13.06.2013

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

    var hasGeocoded = false;

    searchFrom.on('submit', function(){
        //If not geocoded yet
        if (!hasGeocoded) {
            var geocoder = new google.maps.Geocoder();
            var location = locationEl.val();
            geocoder.geocode({'address': location}, function (results, status) {
                hasGeocoded = true;

                if (status == google.maps.GeocoderStatus.OK) {
                    $('#coords').val(
                        results[0].geometry.location.lat() + ',' + results[0].geometry.location.lng()
                    );
                }

                searchFrom.submit();
            });

            return false; //wait for geocoder to finish and re-submit the form
        }

        return true;
    });
person Pavel Dubinin    schedule 01.06.2016