11 Stimmen

Google Maps API Geocode synchronisieren

Ich habe mich gefragt, ob es möglich ist, etwas mit googlemaps api synchron zu geocodieren, also anstatt auf eine Callback-Funktion zu warten, die aufgerufen wird, würde es auf einen Wert warten, der zurückgegeben wird. Hat jemand eine Möglichkeit, so etwas zu tun gefunden.

P.S.: Ich benutze Version 3 der API

7voto

karremans Punkte 71

Ja, das, was Sie versuchen zu erreichen, ist möglich, obwohl eine synchrone Anfrage nicht erforderlich ist.

Sehen Sie sich diesen Code an

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

}); 

Fügen Sie also dem Formular einen Submit-Handler hinzu. Wenn es abgeschickt wird, wird die Geo-Anfrage auf der Grundlage der Adressdaten aus Ihrem Formular ausgeführt. Aber zur gleichen Zeit verschieben Sie die Übermittlung durch Rückgabe false in der Handler. Der Response-Handler erstellt 2 versteckte Textfelder 'lat' und 'long' und speichert die Antwort. Schließlich wird das Formular vom Client-Skript abgeschickt, einschließlich der beiden 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-Bedingungen verstößt, wie oben erwähnt.

2voto

Chris B Punkte 15124

Der Geocoder ruft Ihre Callback-Funktion mit dem Wert auf. Das ist die einzige Möglichkeit, dies zu tun. Wäre es synchron, würde Ihr Skript einfrieren, während es auf die Verarbeitung durch den Geocode wartet. Es gibt wirklich keinen Grund, es so zu machen.

Was genau wollen Sie erreichen?

1voto

Pavel Dubinin Punkte 2390

Ich verwende einfach ein Flag während der Formularübermittlung, um zu wissen, wann die Übermittlung abgeschlossen sein soll oder wann auf die Geokodierung gewartet werden soll. Wenn die Geokodierung abgeschlossen ist, wird das Formular erneut abgeschickt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X