2012-01-10 12 views
16

ho cercato di utilizzare alcuni ajax per salvare luogo luogo nella mia richiesta e ci siamo imbattuti il ​​seguente codice in caso di overflow dello stackrecupero di latitudine/longitudine della posizione utilizzando google.maps.geocoder

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[lat] = results[0].geometry.location.Pa; 
      result[lng] = results[0].geometry.location.Qa; 
     } else { 
      result = "Unable to find address: " + status; 
     } 
    }); 
    return result; 
} 

il mio problema è quando Io chiamo la funzione non restituisce nulla e quando eseguo il debug e setto i breakpoint in chrome, si interrompe sul risultato di ritorno prima che si interrompa sul risultato [lat] = results [0] .geometry.location.Pa;

so l'array deve essere dichiarato come tipo di matrice, ma anche quando ero solo restituendo i risultati [0] .geometry.location oggetto non veniva restituita

che cosa posso fare per restituire il lat/long di la posizione in modo da poter memorizzare nel mio db?

+0

possibile duplicato dell'API di Google Places perché restituisce Lat e Lon sotto una variabile diversa ogni volta?] (Http://stackoverflow.com/questions/13505928/google-places-api-why-does -it-returns-lat-and-lon-under-a-different-variable-eac) – Gajus

risposta

16

Il problema che si sta affrontando è che si sta trattando la funzione geocoder.geocode come completata immediatamente prima di eseguire il risultato di ritorno. Quello che sta realmente accadendo è che geocoder.geocode viene attivato, quindi si ottiene un ritorno immediato del risultato. Poiché il risultato asincrono non è probabilmente tornato, il risultato è vuoto. Pensa al risultato del geocoding come a una spinta, non a un tiro. La funzione storeResult, non mostrata, è il codice che devi fare per salvare le informazioni. Poiché stai combinando un risultato con una stringa di errore, devi gestirlo nella funzione storeResult. In alternativa, puoi avere uno stato nel risultato che indica successo o fallimento.

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[lat] = results[0].geometry.location.Pa; 
     result[lng] = results[0].geometry.location.Qa; 
    } else { 
     result = "Unable to find address: " + status; 
    } 
    storeResult(result); 
    }); 
} 
+0

grazie per questo- ho usato javascript per convalidare l'indirizzo per iniziare poi lo ho postato sul server e ho usato una richiesta http per prendere il informazioni sul codice geografico. sarà probabilmente refactoring più in giù sulla strada –

+0

Come dice Lee Smith, non utilizzare i campi interni dei risultati. Li ho usati solo perché l'OP lo ha fatto. Google cambia spesso i nomi delle variabili interne, quindi non puoi fare affidamento su di essi. Usa le API. –

+4

Vedere la risposta di Lee Smith ... utilizzare invece le funzioni geometry.location.lat() e geometry.location.lng(). – NexusRex

20

Questa non è la risposta, ma non utilizzare Pa e Qa usano sempre il GNL() e lat() funzioni:

place.geometry.location 
{...} 
    Pa: 56.240477 
    Qa: -0.902655999999979 
    toString: function(){return"("+this.lat()+", "+this.lng()+")"} 
    equals: function(a){return!a?k:Cd(this.lat(),a.lat())&&Cd(this.lng(),a.lng())} 
    lat: function(){return this[a]} 
    lng: function(){return this[a]} 
    toUrlValue: function(a){a=Hd(a)?a:6;return $d(this.lat(),a)+","+$d(this.lng(),a)} 
+14

Per aggiungere più chiarezza a questa risposta: il geocoder di Google map a volte restituisce i valori lat e lng come Pa e QA, altre volte Sa e Ta ... l'unico modo garantito è usare geometry.location.lat() e la geometria. location.lng() – NexusRex

2

ho lottato duramente con questo e hanno trovato la seguente al lavoro .

  1. Loop attraverso l'oggetto e spingere in una nuova matrice:

    var newArray = []; 
    
    for (var key in latLng) { 
    
        newArray.push(key); 
    
    } 
    
  2. zero Chiamate oggetto con i valori delle variabili con la sintassi di parentesi quadra, dot pause notazione:

    var lat = latLng[newArray[0]]; 
    
    var lng = latLng[newArray[1]]; 
    
0

Nel mio caso la soluzione più semplice per ottenere latitudine e longitudine dal luogo oggetto era:

var latitude=place.geometry.location['k']; 
    var longitude=place.geometry.location['A']; 
Problemi correlati