obtener longitud latitud google georreferenciación georeferenciar geocodificar geocoder example direcciones coordenadas como google-maps geocoding street-address city

google maps - longitud - obtener la ciudad de los resultados del geocodificador?



google maps geocoder example (11)

Aquí hay un código que puede usar con la biblioteca lodash js: (simplemente reemplace $ scope.x con su propio nombre de variable para almacenar el valor)

_.findKey(vObj.address_components, function(component) { if (component.types[0] == ''street_number'') { $scope.eventDetail.location.address = component.short_name } if (component.types[0] == ''route'') { $scope.eventDetail.location.address = $scope.eventDetail.location.address + " " + component.short_name; } if (component.types[0] == ''locality'') { $scope.eventDetail.location.city = component.long_name; } if (component.types[0] == ''neighborhood'') { $scope.eventDetail.location.neighborhood = component.long_name; } });

Tener problemas para obtener el contenido de diferentes matrices de los resultados del geocodificador.

item.formatted_address funciona pero no item.address_components.locality?

geocoder.geocode( {''address'': request.term }, function(results, status) { response($.map(results, function(item) { alert(item.formatted_address+" "+item.address_components.locality) } });

// la matriz devuelta es;

"results" : [ { "address_components" : [ { "long_name" : "London", "short_name" : "London", "types" : [ "locality", "political" ] } ], "formatted_address" : "Westminster, London, UK" // rest of array...

cualquier ayuda apreciada!

Corriente continua


Creo que es un verdadero dolor que Google no proporcione algún tipo de funcionalidad para obtener estos. De todos modos, creo que la mejor forma de encontrar el objeto correcto es:

geocoder.geocode({''address'': request.term }, function(results, status){ response($.map(results, function(item){ var city = $.grep(item.address_components, function(x){ return $.inArray(''locality'', x.types) != -1; })[0].short_name; alert(city); } });


Devuelve localidad si existe. Si no, devuelve administrative_area_1

city = results[0].address_components.filter(function(addr){ return (addr.types[0]==''locality'')?1:(addr.types[0]==''administrative_area_level_1'')?1:0; });


Esto funcionó para mí:

const localityObject = body.results[0].address_components.filter((obj) => { return obj.types.includes(''locality''); })[0]; const city = localityObject.long_name;

o de una vez:

const city = body.results[0].address_components.filter((obj) => { return obj.types.includes(''locality''); )[0].long_name;

Estoy haciendo esto en Node, así que está bien. Si necesita soportar IE, necesita usar un polyfill para Array.prototype.includes o encontrar otra forma de hacerlo.


Esto funciona al final usando:

var arrAddress = item.address_components; var itemRoute=''''; var itemLocality=''''; var itemCountry=''''; var itemPc=''''; var itemSnumber=''''; // iterate through address_component array $.each(arrAddress, function (i, address_component) { console.log(''address_component:''+i); if (address_component.types[0] == "route"){ console.log(i+": route:"+address_component.long_name); itemRoute = address_component.long_name; } if (address_component.types[0] == "locality"){ console.log("town:"+address_component.long_name); itemLocality = address_component.long_name; } if (address_component.types[0] == "country"){ console.log("country:"+address_component.long_name); itemCountry = address_component.long_name; } if (address_component.types[0] == "postal_code_prefix"){ console.log("pc:"+address_component.long_name); itemPc = address_component.long_name; } if (address_component.types[0] == "street_number"){ console.log("street_number:"+address_component.long_name); itemSnumber = address_component.long_name; } //return false; // break the loop });


Supongo que quiere obtener la ciudad y el estado / provincia:

var map_center = map.getCenter(); reverseGeocode(map_center); function reverseGeocode(latlng){ geocoder.geocode({''latLng'': latlng}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { var level_1; var level_2; for (var x = 0, length_1 = results.length; x < length_1; x++){ for (var y = 0, length_2 = results[x].address_components.length; y < length_2; y++){ var type = results[x].address_components[y].types[0]; if ( type === "administrative_area_level_1") { level_1 = results[x].address_components[y].long_name; if (level_2) break; } else if (type === "locality"){ level_2 = results[x].address_components[y].long_name; if (level_1) break; } } } updateAddress(level_2, level_1); } }); } function updateAddress(city, prov){ // do what you want with the address here }

No intente devolver los resultados, ya que encontrará que no están definidos, como resultado de un servicio asíncrono. Debe llamar a una función, como updateAddress ();


Tuve que crear un programa que llene los campos de latitud, longitud, ciudad, condado y estado en un formulario de usuario cuando el usuario hace clic en una ubicación en el mapa. La página se puede encontrar en http://krcproject.groups.et.byu.net y es un formulario de usuario para permitir que el público contribuya a una base de datos. No pretendo ser un experto, pero funciona muy bien.

<script type="text/javascript"> function initialize() { //set initial settings for the map here var mapOptions = { //set center of map as center for the contiguous US center: new google.maps.LatLng(39.828, -98.5795), zoom: 4, mapTypeId: google.maps.MapTypeId.HYBRID }; //load the map var map = new google.maps.Map(document.getElementById("map"), mapOptions); //This runs when the user clicks on the map google.maps.event.addListener(map, ''click'', function(event) { //initialize geocoder var geocoder = new google.maps.Geocoder() //load coordinates into the user form main_form.latitude.value = event.latLng.lat(); main_form.longitude.value = event.latLng.lng(); //prepare latitude and longitude var latlng = new google.maps.LatLng(event.latLng.lat(), event.latLng.lng()); //get address info such as city and state from lat and long geocoder.geocode({''latLng'': latlng}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { //break down the three dimensional array into simpler arrays for (i = 0 ; i < results.length ; ++i) { var super_var1 = results[i].address_components; for (j = 0 ; j < super_var1.length ; ++j) { var super_var2 = super_var1[j].types; for (k = 0 ; k < super_var2.length ; ++k) { //find city if (super_var2[k] == "locality") { //put the city name in the form main_form.city.value = super_var1[j].long_name; } //find county if (super_var2[k] == "administrative_area_level_2") { //put the county name in the form main_form.county.value = super_var1[j].long_name; } //find State if (super_var2[k] == "administrative_area_level_1") { //put the state abbreviation in the form main_form.state.value = super_var1[j].short_name; } } } } } }); }); } </script>


Usé una función lodash llamada find que devuelve el objeto por el que el predicado devuelve true. ¡Tan sencillo como eso!

let city = find(result, (address) => { return typeof find(address.types, (a) => { return a === ''locality''; }) === ''string''; });


intenté un par de solicitudes diferentes:

MK107BX

Cleveland Park Crescent, Reino Unido

como dices, el tamaño de la matriz devuelto es inconsistente, pero la ciudad para ambos resultados parece estar en el elemento address_component con el tipo de ["localidad", "política"]. Tal vez podrías usar eso como un indicador?

EDITAR : obtenga el objeto de localidad usando jQuery, agréguelo a su función de respuesta :

var arrAddress = item.results[0].address_components; // iterate through address_component array $.each(arrAddress, function (i, address_component) { if (address_component.types[0] == "locality") // locality type console.log(address_component.long_name); // here''s your town name return false; // break the loop });


//if (arrAddress[ac].types[0] == "street_number") { alert(arrAddress[ac].long_name) } // SOKAK NO //if (arrAddress[ac].types[0] == "route") { alert(arrAddress[ac].short_name); } // CADDE //if (arrAddress[ac].types[0] == "locality") { alert(arrAddress[ac].long_name) } // İL //if (arrAddress[ac].types[0] == "administrative_area_level_1") { alert(arrAddress[ac].short_name) } // İL //if (arrAddress[ac].types[0] == "postal_code") { alert(arrAddress[ac].long_name); } // POSTA KODU //if (arrAddress[ac].types[0] == "neighborhood") { alert(arrAddress[ac].long_name); } // Mahalle //if (arrAddress[ac].types[0] == "sublocality") { alert(arrAddress[ac].long_name); } // İlçe //if (arrAddress[ac].types[0] == "country") { alert(arrAddress[ac].long_name); } // Ülke


// Use Google Geocoder to get Lat/Lon for Address function codeAddress() { // Function geocodes address1 in the Edit Panel and fills in lat and lon address = document.getElementById("tbAddress").value; geocoder.geocode({ ''address'': address }, function (results, status) { if (status == google.maps.GeocoderStatus.OK) { loc[0] = results[0].geometry.location.lat(); loc[1] = results[0].geometry.location.lng(); document.getElementById("tbLat").value = loc[0]; document.getElementById("tbLon").value = loc[1]; var arrAddress = results[0].address_components; for (ac = 0; ac < arrAddress.length; ac++) { if (arrAddress[ac].types[0] == "street_number") { document.getElementById("tbUnit").value = arrAddress[ac].long_name } if (arrAddress[ac].types[0] == "route") { document.getElementById("tbStreet").value = arrAddress[ac].short_name } if (arrAddress[ac].types[0] == "locality") { document.getElementById("tbCity").value = arrAddress[ac].long_name } if (arrAddress[ac].types[0] == "administrative_area_level_1") { document.getElementById("tbState").value = arrAddress[ac].short_name } if (arrAddress[ac].types[0] == "postal_code") { document.getElementById("tbZip").value = arrAddress[ac].long_name } } document.getElementById("tbAddress").value = results[0].formatted_address; } document.getElementById("pResult").innerHTML = ''GeoCode Status:'' + status; }) }