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.
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;
}
}
}
}
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;
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.
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
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;
}
}
}
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!!');
}
});
}
$.each(results[0].address_components,function(index,value){
if(value.types[0] === "postal_code"){
$('#postal_code').val(value.long_name);
}
});
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.
Dans PHP j'utilise ce code. Presque dans toutes les conditions cela fonctionne.
$Zip = $data["results"][3]["address_components"];
$Zip = $index[0]["short_name"];
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;
}
}
}
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;
});
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; }
}
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.
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);
}
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 );
});
Avec JSONPath , cela se fait facilement avec une seule ligne de code:
var Zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;
//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;
}
}
});
Utiliser JQuery
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;