2010-11-09 26 views
5

J'essaie d'utiliser le Google géocoder API V3 pour tracer un emplacement sur une carte basée sur une adresse spécifiée par l'utilisateur, le code est ci-dessous.Google Maps géocode API V3 ne pas retourner le résultat dans la fonction javascript

Lorsque je fais une demande directement (par exemple à http://maps.googleapis.com/maps/api/geocode/json?address=peterborough&sensor=false) j'obtiens la réponse attendue. Cependant, lorsque je fais la même requête en utilisant le code ci-dessous, la variable midpoint est toujours indéfinie après la fermeture de la fonction getLatLong.

Que fais-je incorrectement?

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

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

À la lumière des réponses, j'ai maintenant mis à jour le code à ce qui suit. Je ne reçois toujours aucun résultat, avec des points d'arrêt définis dans Firebug le result = data.results [0] .geometry.location; ne se fait jamais toucher.

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

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

Je l'ai! Le code final, qui fonctionne, ressemble à ceci:

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

Répondre

9

Si vous utilisez V3 de l'API ne pouvez-vous pas utiliser ceci?

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

Ce qui précède est ce que j'utilise pour trouver des cordinates longues lat d'une adresse entrée, peut mieux fonctionner?

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

Merci Brady, j'ai essayé cette approche mais le résultat ne renvoie toujours jamais une valeur autre que celle avec laquelle il a été initialisé. – Jason

+0

@jibberish - Vous devez avoir quelque chose qui ne va pas ailleurs parce que si je cours getLatLong ("York"), il renvoie 53.9577018, -1.0822855 – Brady

+0

Je dois en effet. Je peux aller aussi loin que la ligne geocoder.geocode dans le débogueur, puis passer directement l'appel de la fonction au retour. Va continuer à brancher je suppose! – Jason

4

Le problème est votre fonction $.getJSON est asynchrone, mais vous retournez le 'result' de manière synchrone.

Vous devez faire quelque chose comme ça

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 réponse à votre modifier (non testé!): Oh mon Dieu, il ressemble à la V3 géocodage ne supporte pas JSONP. Cela signifie que vous ne pouvez pas effectuer une requête inter-domaines pour obtenir des données dans votre navigateur. Voir http://blog.futtta.be/2010/04/09/no-more-jsonp-for-google-geocoding-webservice/

Cependant, la solution de Brady fonctionne. Je suppose que c'est la façon dont Google veut nous géocoder maintenant.

+0

Merci, j'ai mis à jour ma question en fonction de vos suggestions mais je n'arrive toujours pas à la faire fonctionner. – Jason

+0

Appréciez votre aide, Dan.La solution de Brady ne fonctionne pas pour moi, je vais devoir en chasser un peu plus. +1 pour être un meilleur chercheur que moi! – Jason