Google Maps Geocode API V3 не возвращает результат в функции JavaScript - PullRequest
5 голосов
/ 09 ноября 2010

Я пытаюсь использовать Google Geocoder API V3 для построения местоположения на карте на основе адреса, указанного пользователем, код приведен ниже.

Когда я делаю запрос напрямую (например, к http://maps.googleapis.com/maps/api/geocode/json?address=peterborough&sensor=false), я получаю ожидаемый ответ. Однако, когда я делаю тот же запрос, используя код ниже, переменная midpoint всегда не определена после функция getLatLong вышла.

Что я делаю неправильно?

function loadFromSearch(address) 
{
  midpoint = getLatLong(address);
  mapCentre = midpoint;
  map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
  ...
}


function getLatLong(address) 
{
  var result;
  var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false'
  $.getJSON(url,
  function (data){
     if (data.status == "OK")
     {
        result = data.results[0].geometry.location;
     }
  });
  return result;
}

=============================================== ===================================

В свете полученных ответов я теперь обновил код до следующего. Я все еще не получаю никакого результата, хотя с установленными в Firebug точками останова result = data.results [0] .geometry.location; никогда не попадет.

function loadFromSearch(address) 
{
  midpoint = getLatLong(address, loadWithMidpoint);    
}

function getLatLong(address, callback)
{
   var result;
   var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false'
   $.getJSON(url,{},
   function (data) {
     if (data.status == "OK")
     {
        result = data.results[0].geometry.location;
        callback(result);
     }
   });
}

function loadWithMidpoint(centre)
{
  mapCentre = centre;
  map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
  ...
}

=============================================== ==============================

У меня есть это! Окончательный код, который работает, выглядит следующим образом:

function loadFromSearch(coordinates, address)
{
  midpoint = getLatLong(address, latLongCallback);
}

function getLatLong(address, callback)
{
  var geocoder = new google.maps.Geocoder();
  var result = "";
  geocoder.geocode({ 'address': address, 'region': 'uk' }, function (results, status) {
     if (status == google.maps.GeocoderStatus.OK)
     {
        result = results[0].geometry.location;
        latLongCallback(result);
     }
     else
     {
        result = "Unable to find address: " + status;
     }
  });
  return result;
}

function latLongCallback(result)
{
  mapCentre = result;
  map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
  ...
}

Ответы [ 2 ]

9 голосов
/ 09 ноября 2010

Если вы используете V3 API, вы не можете использовать this?

function findAddressViaGoogle() {
    var address = $("input[name='property_address']").val();
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            newPointClicked(results[0].geometry.location)
        } else {
            alert("Unable to find address: " + status);
        }
    });
}

Это то, что я использую, чтобы найти несколько длинных кординатов введенного адреса. Может ли работать лучше?

EDIT:

function loadFromSearch(address) 
{
midpoint = getLatLong(address);
mapCentre = midpoint;
map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
...
}


function getLatLong(address) 
{
    var geocoder = new google.maps.Geocoder();
    var result = "";
    geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            result = results[0].geometry.location;
        } else {
            result = "Unable to find address: " + status;
        }
    });
    return result;
}
4 голосов
/ 09 ноября 2010

Проблема в том, что ваша $.getJSON функция асинхронная, но вы возвращаете 'result' синхронно.

Вам нужно сделать что-то подобное (не проверено!)

function loadFromSearch(address) 
{
  midpoint = getLatLong(address, function(midpoint){
    // this is a callback
    mapCentre = midpoint;
    map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
    ...           
    });
}

function getLatLong(address, callback) 
{
var result;
var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false'
$.getJSON(url,
  function (data) {
    if (data.status == "OK") {
        result = data.results[0].geometry.location;
        callback(result) // need a callback to get the asynchronous request to do something useful 
    }
  });
}

В ответ на ваше редактирование : О, дорогой, похоже, геокодер V3 не поддерживает JSONP.Это означает, что вы не можете сделать междоменный запрос на получение данных из него в своем браузере.См. http://blog.futtta.be/2010/04/09/no-more-jsonp-for-google-geocoding-webservice/

Однако решение Брейди работает.Я думаю, именно так Google хочет, чтобы мы теперь геокодировали.

...