web-dev-qa-db-fra.com

Récupérer un code postal avec Google Maps Javascript API V3 Reverse Geocode

J'essaie de soumettre une requête utilisant le code postal à ma base de données chaque fois que le centre de visualisation de googlemaps change. Je sais que cela peut être fait avec le géocodage inverse avec quelque chose comme:

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

Bien sûr, ce code ne fonctionne pas réellement. Je me demandais donc comment je devrais changer cela pour pouvoir extraire le code postal du tableau des résultats. Merci.

16
Romaine M.

Bon, alors je l'ai eu. La solution est un peu plus laide que je ne l'aurais souhaité, et je n'ai probablement pas besoin de la dernière boucle for, mais voici le code destiné à quiconque doit extraire de la merde à partir de address_components []. Ceci est à l'intérieur de la fonction de rappel du géocodeur

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.

Ce que j’ai compris jusqu’à présent, c’est que dans la plupart des cas le ZIPCODE est toujours la dernière valeur dans chaque adresse renvoyée, donc, si vous voulez récupérer le tout premier code postal (c'est mon cas), vous pouvez utiliser l'approche suivante:

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

Utiliser JQuery?

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

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

short_name ou long_name fonctionnera ci-dessus
la variable "searchPostalCode" contiendra le code postal (zip?) SI et uniquement SI vous en obtenez un de l'API Google Maps.

Parfois, vous n'obtenez PAS de "code postal" en retour de votre requête.

11
EMuentes

Vous pouvez le faire assez facilement en utilisant la bibliothèque underscore.js: http://documentcloud.github.com/underscore/#find

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

Cela ne prend que deux pour les boucles. Le tableau "results" est mis à jour une fois que nous avons trouvé le premier "type" à être "code_postal".

Il met ensuite à jour le tableau d'origine avec le nouvel ensemble de tableaux trouvé et boucle à nouveau.

            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

Vous pouvez également utiliser ce code, cette fonction vous aidera à obtenir Zip sur un clic de bouton, sur un flou, sur une touche ou une touche.

Il suffit de transmettre l'adresse à cette fonction.

utilisez google api avec la clé valide et l'option de capteur supprimés car ils ne sont plus nécessaires.

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

                }
            });

Cela semble très bien fonctionner pour moi, c'est avec la nouvelle API 3 de Google Maps. Si cela aide quelqu'un, écrivez un commentaire, j'écris mon script au moment où nous parlons ... donc cela pourrait changer.

1
user1116928

Dans PHP j'utilise ce code. Presque dans toutes les conditions cela fonctionne.

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

Romaine M. - merci! Si vous avez juste besoin de trouver le code postal dans le premier résultat renvoyé par Google, vous ne pouvez faire que 2 boucles:

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

J'utilise ce code pour obtenir "Code postal" et "localité", mais vous pouvez l'utiliser pour obtenir tout autre champ en modifiant simplement la valeur du type:

_ 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

En un mot, c'est beaucoup d'effort. Au moins avec l’API v2, je pourrais récupérer ces détails comme suit:

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

Il doit exister un moyen plus élégant de récupérer des composants adresse_individuels sans passer par le jujitsu en boucle que vous venez de traverser.

0
JFrancis

Ce code simple fonctionne pour moi

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

Il semble qu’aujourd’hui il vaut mieux l’obtenir de l’API reposante, essayez simplement:

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

Utiliser un appel AJAX GET fonctionne parfaitement!

Quelque chose comme:

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

Avec JSONPath , cela se fait facilement avec une seule ligne de code:

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

Utiliser JQuery

  • Vous ne pouvez pas savoir à quel emplacement du code address est stocké dans le tableau address_components. Parfois, dans address_components.length - 1> il se peut que le code ne soit pas là. Ceci est vrai dans le géocodage "Adresse à la fin".
  • Vous pouvez être sûr que le code postal contiendra une chaîne "code postal". Le meilleur moyen est donc de vérifier cela.
   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