2009-08-21 12 views
11

Ich frage mich, ob es möglich ist, etwas mit googlemaps api synchron zu geocodieren, so dass es warten würde, bis eine Callback-Funktion aufgerufen wird. Hat jemand einen Weg gefunden, so etwas zu tun?Google Maps API Geocode synchron

P. S .: Ich bin mit Version 3 des api

Antwort

1

Die Geocoder ruft Ihre Callback-Funktion mit dem Wert. Das ist der einzige Weg, es zu tun. Wenn es synchron wäre, würde Ihr Skript anhalten, während es darauf wartet, dass der Geocode verarbeitet wird. Es gibt wirklich keinen Grund, es so zu machen.

Was genau versuchen Sie zu erreichen?

+1

Ich habe ein Formular, das eine Adresse enthält. Als Teil der Validierung der Formulardaten dachte ich daran, einen Google-Geocoder zu verwenden, um die Adresse zu überprüfen. Ich brauche auch die Breiten- und Längengrade, um sie in meine Datenbank einzugeben. Ich weiß, dass ich das mit der Callback-Funktion machen kann, aber das scheint ein Hack zu sein und wäre komplizierter. – giroy

+1

Der Geocoder ist ausschließlich für die Verwendung mit der Callback-Funktion vorgesehen. Mach dir keine Sorgen, es ist kein Hack. :) Es ist wirklich deine einzige Option. Beachten Sie jedoch, dass Sie die Nutzungsbedingungen von Google Maps brechen, wenn Sie den Geocodierer verwenden, ohne die Ergebnisse auf einer Google-Karte anzuzeigen. –

+0

Soweit ich weiß, können Sie die Google API nicht in einem internen System oder mit einer ausgewählten Zielgruppe verwenden. Ihre Seite, die die Karten verwendet, sollte für das gesamte Internet geöffnet sein - lesen Sie die Vertragsbedingungen. Gut @B Chris @Chris B –

7

Ja, was Sie erreichen möchten, ist möglich, obwohl eine synchrone Anforderung nicht benötigt wird.

Blick auf diesen Code

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

}); 

So befestigen einreichen Handler Form, wenn es eingereicht wird tun, um die Anfrage geo auf die Adresse Informationen aus Ihrem Formular basiert. Aber zur gleichen Zeit das Einreichen zurückstellen, indem Sie im Handler falsch zurückgeben. Der Antwort-Handler wird 2 versteckte Textfelder 'lat' und 'long' machen und die Antwort speichern. Schließlich wird das Formular vom Clientskript übergeben, einschließlich der zwei neuen Felder. Auf der Serverseite können Sie sie in der DB speichern.

!! Beachten Sie, dass dies möglich ist, aber wahrscheinlich gegen die Google-Begriffe, wie oben erwähnt.

+1

große Antwort! Ich würde hinzufügen, dass Sie die Geo-Anfrage tun können, sobald der Benutzer die benötigten Informationen zur Verfügung stellt (oder mit einer gewissen Zeit danach). Während er den Rest des Formulars abschließt, hat der Geocoder Zeit, die Antwort zu senden. Sie werden mehr Geo-Anfragen wie diese machen, wenn der Benutzer seine Meinung ändert. – GoTo

+0

Wie für google Begriffe glaube ich nicht, dass Sie sie brechen, wenn Sie einfach die Antworten in einer Datenbank speichern. So ziemlich jede Art von Webapp, die über ein einfaches Beispiel hinausgeht, erfordert, dass Sie die Antworten in einer Datenbank speichern. Sie brechen sie, wenn Sie die Antworten ohne Google Maps oder in einem geschlossenen/internen System verwenden. – GoTo

1

Ich verwende einfach eine Flagge während des Formulars submit, um zu wissen, wann submit übergeben werden sollte oder wann es auf Geocodierung warten sollte. Wenn die Geocodierung abgeschlossen ist, wird das Formular erneut erneut gesendet.

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