webentwicklung-frage-antwort-db.com.de

Postleitzahl mit Google Maps abrufen Javascript API V3 Reverse Geocode

Ich versuche, eine Abfrage mit der Postleitzahl an meine Datenbank zu senden, wenn sich das Ansichtsfenster von googlemaps ändert. Ich weiß, dass dies mit umgekehrter Geokodierung möglich ist, etwa mit:

google.maps.event.addListener(map, 'center_changed', function(){
newCenter();
});
...
function newCenter(){
var newc = map.getCenter();
geocoder.geocode({'latLng': newc}, function(results, status){
if (status == google.maps.GeocoderStatus.OK) {
  var newzip = results[0].address_components['postal_code'];
  }
});
};

Dieser Code funktioniert natürlich nicht. Also habe ich mich gefragt, wie ich das ändern müsste, um die Postleitzahl aus dem Ergebnisfeld zu extrahieren. Danke

16
Romaine M.

Okay, ich habe es verstanden. Die Lösung ist etwas hässlicher als ich möchte, und ich brauche wahrscheinlich nicht die letzte for-Schleife, aber hier ist der Code für alle anderen, die Mist aus address_components [] extrahieren müssen. Dies ist in der Geocoder Callback-Funktion enthalten

for(i; i < results.length; i++){
            for(var j=0;j < results[i].address_components.length; j++){
                for(var k=0; k < results[i].address_components[j].types.length; k++){
                    if(results[i].address_components[j].types[k] == "postal_code"){
                        zipcode = results[i].address_components[j].short_name;
                    }
                }
            }
    }
9
Romaine M.

Was ich bisher realisiert habe ist, dass in den meisten Fällen der ZIPCODE ist immer der letzte Wert in jeder zurückgegebenen Adresse. Wenn Sie also die allererste Postleitzahl abrufen möchten (dies ist mein Fall), können Sie den folgenden Ansatz verwenden:

var address = results[0].address_components;
var zipcode = address[address.length - 1].long_name;
17
Tuco

JQuery verwenden?

var searchAddressComponents = results[0].address_components,
    searchPostalCode="";

$.each(searchAddressComponents, function(){
    if(this.types[0]=="postal_code"){
        searchPostalCode=this.short_name;
    }
});

short_name oder long_name funktionieren oben
Die "searchPostalCode" -Variable enthält den Postleitzahlcode (ZIP) IF und nur, wenn Sie einen von Google Maps API erhalten.

Manchmal erhalten Sie KEINEN "postal_code" als Gegenleistung für Ihre Anfrage.

11
EMuentes

Sie können dies ganz einfach mit der Underscore.js-Bibliothek tun: http://documentcloud.github.com/underscore/#find

_.find(results[0].address_components, function (ac) { return ac.types[0] == 'postal_code' }).short_name
10
Jeff S

Dies dauert nur zwei für Schleifen. Das Array "results" wird aktualisiert, sobald wir festgestellt haben, dass der erste "type" "postal_code" ist.

Anschließend wird das ursprüngliche Array mit dem neu gefundenen Array-Set aktualisiert und erneut Schleifen erstellt.

            var i, j,
            result, types;

            // Loop through the Geocoder result set. Note that the results
            // array will change as this loop can self iterate.
            for (i = 0; i < results.length; i++) {

                result = results[i];

                types = result.types;

                for (j = 0; j < types.length; j++) {

                    if (types[j] === 'postal_code') {

                        // If we haven't found the "long_name" property,
                        // then we need to take this object and iterate through
                        // it again by setting it to our master loops array and 
                        // setting the index to -1
                        if (result.long_name === undefined) {
                            results = result.address_components;
                            i = -1;
                        }
                        // We've found it!
                        else {
                            postcode = result.long_name;
                        }

                        break;

                    }

                }

            }
2
learntoswim

Sie können diesen Code auch verwenden. Diese Funktion hilft Ihnen dabei, das Klicken auf die Schaltfläche oder das Aufblättern von Tasten oder das Herauffahren von Tasten oder das Herunterschalten zu aktivieren.

Übergeben Sie einfach die Adresse an diese Funktion.

verwenden Sie Google API, wobei der gültige Schlüssel und die Sensoroption entfernt wurden, da dies jetzt nicht erforderlich ist.

function callZipAPI(addSearchZip)
{    
    var geocoder = new google.maps.Geocoder();
    var zipCode = null;

    geocoder.geocode({ 'address': addSearchZip }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {

            //var latitude = results[0].geometry.location.lat();
            //var longitude = results[0].geometry.location.lng();

            var addressComponent = results[0].address_components;            
            for (var x = 0 ; x < addressComponent.length; x++) {
                var chk = addressComponent[x];
                if (chk.types[0] == 'postal_code') {
                    zipCode = chk.long_name;
                }
            }
            if (zipCode) {
                alert(zipCode);
            }
            else {
                alert('No result found!!');
            }
        } else {            
            alert('Enter proper address!!');
        }
    });
}
2
Ashu Ashutosh
$.each(results[0].address_components,function(index,value){
    if(value.types[0] === "postal_code"){
        $('#postal_code').val(value.long_name);
    }
});
1
user2698099
places.getDetails( request_details, function(results_details, status){

                // Check if the Service is OK
                if (status == google.maps.places.PlacesServiceStatus.OK) {                  

                    places_postal           = results_details.address_components
                    places_phone            = results_details.formatted_phone_number
                    places_phone_int        = results_details.international_phone_number
                    places_format_address   = results_details.formatted_address
                    places_google_url       = results_details.url
                    places_website          = results_details.website
                    places_rating           = results_details.rating

                    for (var i = 0; i < places_postal.length; i++ ) {
                        if (places_postal[i].types == "postal_code"){
                            console.log(places_postal[i].long_name)
                        }
                    }

                }
            });

Das scheint für mich sehr gut zu funktionieren, dies ist mit der neuen Google Maps API V3 der Fall. Wenn dies jemandem hilft, schreibe einen Kommentar, ich schreibe mein Skript, während wir sprechen ... es könnte sich also ändern.

1
user1116928

In PHP verwende ich diesen Code. Fast unter allen Bedingungen funktioniert es.

$Zip = $data["results"][3]["address_components"];
$Zip = $index[0]["short_name"];
1
B. Bohdan

Romaine M. - Danke! Wenn Sie nur die Postleitzahl im ersten Ergebnis von Google suchen müssen, können Sie nur 2 Schleifen ausführen:

for(var j=0;j < results[0].address_components.length; j++){
    for(var k=0; k < results[0].address_components[j].types.length; k++){
        if(results[0].address_components[j].types[k] == "postal_code"){
            zipcode = results[0].address_components[j].long_name;
        }
    }
}
0
Dale Mugford
 return $http.get('//maps.googleapis.com/maps/api/geocode/json', {
            params: {
                address: val,
                sensor: false
            }
        }).then(function (response) {
           var model= response.data.results.map(function (item) {
               // return item.address_components[0].short_name;
               var short_name;
             var st=  $.each(item.address_components, function (value, key) {
                    if (key.types[0] == "postal_code") {
                        short_name= key.short_name;
                    }
                });
             return short_name;

            });
                return model;
        });
0
user6009947

Ich verwende diesen Code, um "Postleitzahl" und "Ort" zu erhalten, aber Sie können es verwenden, um jedes andere Feld zu erhalten, indem Sie einfach den Wert von type ändern:

JAVASCRIPT

var address = results[0].address_components;
var zipcode = '';
var locality = '';

for (var i = 0; i < address.length; i++) {
     if (address[i].types.includes("postal_code")){ zipcode = address[i].short_name; }    
     if (address[i].types.includes("locality")){ locality = address[i].short_name; }
}
0
Santi Nunez

In einem Wort ist das viel Mühe. Zumindest mit der v2-API konnte ich diese Details so abrufen:

var place = response.Placemark[0];
var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

myAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName

myCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName

myState = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName

myZipCode = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber

Es muss einen eleganteren Weg geben, einzelne address_components abzurufen, ohne das durchlaufene Jujitsu zu durchlaufen, das Sie gerade durchlaufen haben.

0
JFrancis

Dieser einfache Code funktioniert für mich

for (var i = 0; i < address.length; i++) {
        alert(address[i].types);
        if (address[i].types == "postal_code")
            $('#postalCode').val(address[i].long_name);
        if (address[i].types == "")
            $('#country').val(address[i].short_name);
    }
0
Rene Vazquez

Es scheint, dass es heutzutage besser ist, es von der API zu erhalten, versuchen Sie es einfach:

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_KEY_HERE

Die Verwendung eines AJAX GET-Aufrufs funktioniert einwandfrei!

So etwas wie:

var your_api_key = "***";
var f_center_lat = 40.714224;
var f_center_lon = -73.961452;

$.ajax({ url: "https://maps.googleapis.com/maps/api/geocode/json?latlng="+f_center_lat+","+f_center_lon+"&key="+your_api_key,
            method: "GET"
        })
        .done(function( res ) { if (debug) console.log("Ajax result:"); console.log(res);
            var zipCode = null;
            var addressComponent = res.results[0].address_components;
            for (var x = 0 ; x < addressComponent.length; x++) {
                var chk = addressComponent[x];
                if (chk.types[0] == 'postal_code') {
                    zipCode = chk.long_name;
                }
            }
            if (zipCode) {
                //alert(zipCode);
                $(current_map_form + " #postalcode").val(zipCode);
            }
            else {
                //alert('No result found!!');
                if (debug) console.log("Zip/postal code not found for this map location.")
            }
        })
        .fail(function( jqXHR, textStatus ) {
            console.log( "Request failed (get postal code via geocoder rest api). Msg: " + textStatus );
        });
0
Darío Pm

Mit JSONPath ist dies leicht mit einer Codezeile möglich:

var Zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;
0
Ray Myers
//autocomplete is the text box where u will get the suggestions for an address.

autocomplete.addListener('place_changed', function () {
//Place will get the selected place geocode and returns with the address              
//and marker information.
        var place = autocomplete.getPlace();
//To select just the Zip code of complete address from marker, below loop //will help to find. Instead of y.long_name you can also use y.short_name. 
        var zipCode = null;
        for (var x = 0 ; x < place.address_components.length; x++) {
            var y = place.address_components[x];
            if (y.types[0] == 'postal_code') {
                zipCode = y.long_name;
            }
        }
    });
0
Ashu Ashutosh

Jquery verwenden

  • Sie können nicht sicher sein, an welcher Stelle im address_components-Feld die Postleitzahl gespeichert ist. In address_components.length - 1> pincode ist manchmal nicht vorhanden. Dies gilt für die Geocodierung "Address to Latlng".
  • Sie können sicher sein, dass die Postleitzahl eine Zeichenfolge "postal_code" enthält. Der beste Weg ist also, das zu überprüfen.
   var postalObject = $.grep(results[0].address_components, function(n, i) {
                                    if (n.types[0] == "postal_code") {
                                        return n;
                                    } else {
                                        return null;
                                    }
                                });

                                $scope.query.Pincode = postalObject[0].long_name;
0
Sunny

Ich denke, anstatt vom Index abhängig zu sein, prüft es besser den Adresstypschlüssel innerhalb der Komponente. Ich habe dieses Problem mit einem Schaltergehäuse gelöst.

      var address = '';
      var pin = '';
      var country = '';
      var state = '';
      var city = '';
      var streetNumber = '';
      var route ='';
      var place = autocomplete.getPlace(); 
      for (var i = 0; i < place.address_components.length; i++) {
        var component = place.address_components[i];
        var addressType = component.types[0];

        switch (addressType) {
            case 'street_number':
                streetNumber = component.long_name;
                break;
            case 'route':
                route = component.short_name;
                break;
            case 'locality':
                city = component.long_name;
                break;
            case 'administrative_area_level_1':
                state = component.long_name;
                break;
            case 'postal_code':
                pin = component.long_name;
                break;
            case 'country':
                country = component.long_name;
                break;
        }
       }
0
webmatrix