2010-11-09 9 views
5

Estoy tratando de usar Google geocoder API V3 para trazar una ubicación en un mapa basado en una dirección especificada por el usuario, el código está debajo.google maps geocode API V3 no devuelve el resultado en la función javascript

Cuando realizo una solicitud directamente (por ejemplo, http://maps.googleapis.com/maps/api/geocode/json?address=peterborough&sensor=false) recibo la respuesta esperada. Sin embargo, cuando realizo la misma solicitud utilizando el siguiente código, la variable de punto medio siempre está indefinida después de que la función getLatLong haya salido.

¿Qué estoy haciendo incorrectamente?

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; 
} 

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

A la luz de las respuestas, tengo ahora actualicé el código a lo siguiente. Todavía no obtengo ningún resultado, con los puntos de interrupción establecidos en Firebug el resultado = data.results [0] .geometry.location; nunca es golpeado.

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); 
    ... 
} 

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

¡Lo tengo! El código final, que funciona, se ve así:

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); 
    ... 
} 

Respuesta

9

Si está utilizando V3 de la API, ¿no puede usar esto?

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); 
     } 
    }); 
}

Lo anterior es lo que utilizo para encontrar algunos largos cordinates lat de una dirección introducida, pueden funcionar mejor?

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; 
}
+0

Gracias Brady, he intentado este enfoque, pero el resultado todavía nunca devuelve un valor distinto al que se inicializó. – Jason

+0

@jibberish - Debe tener algo que va mal en otro lugar porque si ejecuto getLatLong ("York") devuelve 53.9577018, -1.0822855 – Brady

+0

Debo de hecho. Puedo llegar hasta la línea geocoder.geocode en el depurador y luego omite la llamada a la función directamente a la devolución. ¡Seguiré enchufándome, supongo! – Jason

4

El problema es que su función $.getJSON es asíncrona, sin embargo, que están regresando al 'result' de forma sincrónica.

que tiene que hacer algo como esto

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 
    } 
    }); 
} 

En respuesta a su edición (no probado!): ¡Dios mío, parece que el geocodificador V3 no soporta JSONP. Esto significa que no puede hacer una solicitud entre dominios para obtener datos de su navegador. Ver http://blog.futtta.be/2010/04/09/no-more-jsonp-for-google-geocoding-webservice/

Sin embargo, la solución de Brady funciona. Supongo que esa es la forma en que Google quiere que geocodifiquemos ahora.

+0

Gracias, he actualizado mi pregunta en función de sus sugerencias, pero todavía no puedo hacer que funcione. – Jason

+0

Apreciar tu ayuda, Dan.La solución de Brady no funciona para mí, tendré que cazar un poco más. +1 por ser un mejor investigador que yo! – Jason

Cuestiones relacionadas