postal obtener mexico google geolocalización geocodificar direcciones coordenadas convertir con codigo google-maps google-maps-api-3 geocoding reverse-geocoding postal-code

obtener - Recuperación de código postal con Google Maps Javascript API V3 Geocodificación inversa



obtener codigo postal google maps api (19)

¿Usando JQuery?

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

short_name o long_name funcionarán arriba
el "searchPostalCode" var contendrá el código postal (zip?) IF y solo SI obtiene uno de la API de Google Maps.

A veces NO obtiene un "código postal" a cambio de su consulta.

Estoy tratando de enviar una consulta utilizando el código postal a mi base de datos cada vez que cambie el centro de la ventana gráfica de googlemaps. Sé que esto se puede hacer con geocodificación inversa con algo como:

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

Por supuesto, este código no funciona realmente. Así que me preguntaba cómo tendría que cambiar esto para extraer el código postal de la matriz de resultados. Gracias


Creo que en lugar de depender del índice, comprueba mejor la clave de tipo de dirección dentro del componente. Resolví este problema usando un caso del interruptor.

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


En PHP utilizo este código. Casi en todas las condiciones funciona.

$zip = $data["results"][3]["address_components"]; $zip = $index[0]["short_name"];


En una palabra, eso es mucho esfuerzo. Al menos con la API v2, podría recuperar esos detalles de esta manera:

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

Tiene que haber una forma más elegante de recuperar los componentes de dirección individuales sin pasar por el jujitsu en bucle que acabas de pasar.


Está bien, así que lo tengo. La solución es un poco más fea de lo que me gustaría, y probablemente no necesito el último bucle, pero aquí está el código para cualquier persona que necesite extraer basura de address_components []. Esto está dentro de la función de devolución de llamada del geocodificador

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


Este código simple me funciona

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


Esto toma sólo dos para bucles. La matriz de "resultados" se actualiza una vez que encontramos que el primer "tipo" es "postal_code".

A continuación, actualiza la matriz original con el conjunto de matrices recién encontrado y vuelve a realizar un bucle.

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


Lo que me he dado cuenta hasta ahora es que en la mayoría de los casos, el ZIPCODE siempre es el último valor dentro de cada dirección devuelta, por lo tanto, si desea recuperar el primer código postal (este es mi caso), puede utilizar el siguiente método:

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


Parece que hoy en día es mejor obtenerlo de la API tranquila, simplemente intente:

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

¡Usar una llamada AJAX GET funciona perfectamente!

Algo como:

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



Romaine M. - ¡Gracias! Si solo necesita encontrar el código postal en el primer resultado devuelto por Google, puede hacer solo 2 bucles:

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


También puedes usar este código, esta función te ayudará a hacer clic en el botón zip o onblur o keyup o keydown.

Simplemente pase la dirección a esta función.

use google api con la clave válida y la opción del sensor eliminada ya que no es necesario ahora.

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


Usando JSONPath , se hace fácilmente con una línea de código:

var zip = $.results[0].address_components[?(@.types=="postal_code")].long_name;


Usando jquery

  • No puede estar seguro en qué ubicación de la matriz address_components se almacena el código postal. A veces, en address_components.length - 1> pincode puede no estar allí. Esto es cierto en la geocodificación "Address to latlng".
  • Puede estar seguro de que el código postal contendrá una cadena de "código postal". Así que la mejor manera es verificar eso.

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;


Utilizo este código para obtener "Código postal" y "localidad", pero puede usarlo para obtener cualquier otro campo simplemente cambiando el valor de tipo:

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


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


$.each(results[0].address_components,function(index,value){ if(value.types[0] === "postal_code"){ $(''#postal_code'').val(value.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; } } });


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

Esto parece funcionar muy bien para mí, esto es con el nuevo API de Google Maps V3. Si esto ayuda a alguien, escriba un comentario, estoy escribiendo mi guión mientras hablamos ... para que pueda cambiar.