45 votes

Obtenir la ville à partir des résultats du géocodeur ?

Avoir 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 renvoyé est;

 "results" : [
      {
         "address_components" : [
            {
               "long_name" : "London",
               "short_name" : "London",
               "types" : [ "locality", "political" ]
            } ],
          "formatted_address" : "Westminster, London, UK" // reste du tableau...

toute aide est appréciée!

Dc

60voto

daniel Crabbe Points 696

À la fin, j'ai réussi à le faire en utilisant :

var arrAddress = item.address_components;
var itemRoute='';
var itemLocality='';
var itemCountry='';
var itemPc='';
var itemSnumber='';

// parcourir le tableau d'éléments d'adresse
$.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; // interrompre la boucle   
});

5 votes

Fonctionne bien mais serait plus élégant et moins de code comme une déclaration 'switch'.

4 votes

Ne vous attendez pas à ce que cela fonctionne de manière fiable, le géocodage de Google comporte de nombreuses lacunes. "locality" n'est pas toujours disponible, parfois la ville se trouve en réalité dans le champ de l'état (niveau_1). Surtout lorsque le type de retour est ROOFTOP, les résultats du géocodage de Google sont mauvais. Dans les pays étrangers, le format change soudainement. Vous pouvez faire beaucoup plus confiance aux résultats "APPROXIMATE" qu'à ceux de "ROOFTOP"

0 votes

Correct. Ne fonctionne pas de manière fiable. Google note qu'il n'y a pas de cohérence dans les composants que vous obtenez dans votre réponse. Il se peut aussi que cela change avec le temps. developers.google.com/maps/documentation/places/web-service/‌​… sous "Résultats des détails des lieux"

15voto

Tsar Points 4226

J'ai essayé quelques requêtes différentes:

MK107BX

Cleveland Park Crescent, UK

comme vous l'avez dit, la taille du tableau retournée est incohérente mais la ville pour les deux résultats semble être dans l'élément address_component avec le type [ "locality", "political" ]. Peut-être pouvez-vous utiliser cela comme indicateur?

ÉDIT: obtenir l'objet locality en utilisant jQuery, ajoutez ceci à votre fonction response:

var arrAddress = item.results[0].address_components;
// parcourir le tableau address_component
$.each(arrAddress, function (i, address_component) {
    if (address_component.types[0] == "locality") // type locality
        console.log(address_component.long_name); // voici le nom de votre ville
        return false; // arrêter la boucle
    });

11voto

Ed Kern Points 101

J'ai dû créer un programme qui remplirait les champs de latitude, longitude, ville, comté et état dans un formulaire utilisateur lorsque l'utilisateur clique sur un emplacement sur la carte. La page peut être trouvée à http://krcproject.groups.et.byu.net et est un formulaire utilisateur permettant au public de contribuer à une base de données. Je ne prétends pas être un expert, mais ça fonctionne très bien.

  function initialize() 
  {
    //définir les paramètres initiaux de la carte ici
    var mapOptions = 
    {
      //définir le centre de la carte comme centre des États-Unis continus
      center: new google.maps.LatLng(39.828, -98.5795),
      zoom: 4,
      mapTypeId: google.maps.MapTypeId.HYBRID
    };

    //charger la carte
    var map = new google.maps.Map(document.getElementById("map"), mapOptions);

    //Cela s'exécute lorsque l'utilisateur clique sur la carte
    google.maps.event.addListener(map, 'click', function(event)
    {
      //initialiser le géocodeur
      var geocoder = new google.maps.Geocoder()

      //charger les coordonnées dans le formulaire utilisateur
      main_form.latitude.value = event.latLng.lat();
      main_form.longitude.value = event.latLng.lng();

      //préparer latitude et longitude
      var latlng = new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());

      //obtenir des informations d'adresse telles que la ville et l'état à partir de la latitude et de la longitude
      geocoder.geocode({'latLng': latlng}, function(results, status) 
      {
        if (status == google.maps.GeocoderStatus.OK) 
        {
          //décomposer le tableau tridimensionnel en des tableaux plus simples
          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)
              {
                //trouver la ville
                if (super_var2[k] == "locality")
                {
                  //mettre le nom de la ville dans le formulaire
                  main_form.city.value = super_var1[j].long_name;
                }
                //trouver le comté
                if (super_var2[k] == "administrative_area_level_2")
                {
                  //mettre le nom du comté dans le formulaire
                  main_form.county.value = super_var1[j].long_name;
                }
                //trouver l'État
                if (super_var2[k] == "administrative_area_level_1")
                {
                  //mettre l'abréviation de l'État dans le formulaire
                  main_form.state.value = super_var1[j].short_name;
                }
              }
            }
          }
        }
      });
    });
  }

0 votes

J'adore ça, merci, la seule chose que je suggérerais est peut-être une vérification/interruption pour quand un composant a été trouvé.

7voto

Jonathan Tonge Points 860

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
}

Ne cherchez pas à retourner les résultats car vous constaterez qu'ils sont indéfinis - un résultat d'un service asynchrone. Vous devez appeler une fonction, comme updateAddress();

0 votes

Vous devez sortir de chaque boucle, vérifiez votre console, cependant le code fonctionne très bien donc merci beaucoup!

5voto

J'ai créé cette fonction pour obtenir les principales informations des résultats du géocodeur :

const getDataFromGeoCoderResult = (geoCoderResponse) => {
  const geoCoderResponseHead = geoCoderResponse[0];
  const geoCoderData = geoCoderResponseHead.address_components;
  const isEmptyData = !geoCoderResponseHead || !geoCoderData;

  if (isEmptyData) return {};

  return geoCoderData.reduce((acc, { types, long_name: value }) => {
    const type = types[0];

    switch (type) {
      case 'route':
        return { ...acc, route: value };
      case 'locality':
        return { ...acc, locality: value };
      case 'country':
        return { ...acc, country: value };
      case 'postal_code_prefix':
        return { ...acc, postalCodePrefix: value };
      case 'street_number':
        return { ...acc, streetNumber: value };
      default:
        return acc;
    }
  }, {});
};

Donc, vous pouvez l'utiliser de cette manière :

const geoCoderResponse = await geocodeByAddress(value);
const geoCoderData = getDataFromGeoCoderResult(geoCoderResponse);

disons que vous cherchez le Stade Santiago Bernabéu, alors, le résultat sera :

{
  country: 'Espagne',
  locality: 'Madrid',
  route: 'Avenida de Concha Espina',
  streetNumber: '1',
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X