Ayant des problèmes pour obtenir le contenu des différents tableaux à partir des résultats du géocodeur.
item.formatted_address fonctionne mais pas 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)
}
});
// le tableau retourné est;
"results" : [
{
"address_components" : [
{
"long_name" : "London",
"short_name" : "London",
"types" : [ "locality", "political" ]
} ],
"formatted_address" : "Westminster, London, UK" // rest of array...
toute aide appréciée!
Dc
Cela a fonctionné à la fin en utilisant:
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
});
essayé plusieurs demandes différentes:
comme vous le dites, la taille du tableau renvoyé est incohérente, mais la ville pour les deux résultats semble être dans l'élément address_component avec le type ["localité", "politique"]. Peut-être pourriez-vous utiliser cela comme indicateur?
EDIT: récupère l'objet locality à l'aide de jQuery, ajoutez ceci à votre fonction réponse:
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
});
Je devais créer un programme qui renseignerait les champs latitude, longitude, ville, comté et état dans un formulaire utilisateur lorsque l'utilisateur clique sur un emplacement de la carte. La page se trouve à l’adresse http://krcproject.groups.et.byu.net et constitue un formulaire utilisateur permettant au public de contribuer à une base de données. Je ne prétends pas être un expert, mais cela fonctionne très 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>
Je suppose que vous voulez obtenir la ville et l'état/province:
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
}
N'essayez pas de renvoyer les résultats car vous constaterez qu'ils ne sont pas définis - ils résultent d'un service asynchrone. Vous devez appeler une fonction, telle que updateAddress ();
Je pense que c’est vraiment pénible que Google ne fournisse aucune sorte de fonctionnalité pour les obtenir. Quoi qu'il en soit, je pense que le meilleur moyen de trouver le bon objet est:
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);
}
});
// 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;
})
}
Cela a fonctionné pour moi:
const localityObject = body.results[0].address_components.filter((obj) => {
return obj.types.includes('locality');
})[0];
const city = localityObject.long_name;
ou en une fois:
const city = body.results[0].address_components.filter((obj) => {
return obj.types.includes('locality');
)[0].long_name;
Je fais ça dans Node, donc ça va. Si vous avez besoin de supporter IE, vous devez utiliser un polyfill pour Array.prototype.includes
ou trouver un autre moyen de le faire.
J'ai utilisé une fonction lodash appelée find qui retourne l'objet pour lequel le prédicat renvoie true. Aussi simple que cela!
let city = find(result, (address) => {
return typeof find(address.types, (a) => { return a === 'locality'; }) === 'string';
});
//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
Voici un code que vous pouvez utiliser avec la bibliothèque lodash js: (remplacez simplement le $ scope.x par votre propre nom de variable pour stocker la valeur)
_.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;
}
});
Retourne la localité si elle existe. Si non - retourne 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;
});