2014-06-11 3 views
1

Il semble y avoir certaines difficultés à obtenir des composants d'adresse individuels à partir d'un résultat de géocodage Google JSON. Par exemple, je souhaite obtenir les noms de comté en fonction des adresses. Quelqu'un pourrait-il expliquer pourquoi, par exemple, ce code ne fonctionne pas?L'extraction de composants d'adresse individuels à partir des résultats du géocodeur Google dans Google Apps Script

function county(){ 
    var geo = Maps.newGeocoder().geocode('address'); 
    for (var i=0; i<geo.results.address_components.length; i++) 
    for (var j=0; j<geo.results.address_components[i].types.length; j++) 
     if (geo.results.address_components[i].types[j]=="administrative_area_level_2") 
     var county = geo.results.address_components[i].long_name; 
} 

Je sais que cela trop simpliste, mais il ne peut pas reconnaître même les results.address_components

Toutes les suggestions?

+0

Bienvenue à SO, Bill! Pas besoin de mettre en garde votre question, ce n'était pas stupide du tout (même si ceux-ci sont bien ici aussi, des points faciles pour les répondeurs). Pour référence future, il sera plus facile pour la communauté de dépanner si vous pouvez fournir un code reproductible (c'est-à-dire utiliser une adresse réelle au lieu de 'adresse') et gagner du temps si vous copiez dans le message d'erreur. À votre santé. –

Répondre

0

Vous pouvez utiliser l'objet Logger pour examiner les données intermédiaires comme ceci:

Logger.log(geo) 

Vous verrez quelque chose comme ça dans le menu Affichage, sous des bûches:

{results=[{address_components=[{long_name=Address, short_name=Address, types=[point_of_interest, establishment]}, {long_name=Madrid, short_name=Madrid, types=[locality, political]}, {long_name=Madrid, short_name=M, types=[administrative_area_level_2, political]}, {long_name=Community of Madrid, short_name=Community of Madrid, types=[administrative_area_level_1, political]}, {long_name=Spain, short_name=ES, types=[country, political]}, {long_name=28039, short_name=28039, types=[postal_code]}], formatted_address=Address, 28039 Madrid, Spain, types=[hospital, point_of_interest, establishment], geometry={viewport={southwest={lng=-3.708366880291502, lat=40.44598801970851}, northeast={lng=-3.705668919708498, lat=40.44868598029151}}, location_type=APPROXIMATE, location={lng=-3.7070179, lat=40.447337}}}, {address_components=[{long_name=Address:, short_name=Address:, types=[point_of_interest, establishment]}, {long_name=Pineville, short_name=Pineville, types=[locality, political]}, {long_name=1, Charlotte, short_name=1, Charlotte, types=[administrative_area_level_3, political]}, {long_name=Mecklenburg County, .........

Si vous exécutez

function myFunction() { 
    var geo = Maps.newGeocoder().geocode('1600 pennsylvania ave, washington, dc'); 
    Logger.log(geo.results[0].address_components); 
} 

myFunction(); 

Vous pouvez voir les composants dans le journal, il ressemblera à ceci:

{long_name=1600, short_name=1600, types=[street_number]}, {long_name=President's Park, short_name=President's Park, types=[establishment]}, {long_name=Pennsylvania Avenue Northwest, short_name=Pennsylvania Ave NW, types=[route]}, {long_name=Washington, short_name=Washington, types=[locality, political]}, {long_name=District of Columbia, short_name=DC, types=[administrative_area_level_1, political]}, {long_name=United States, short_name=US, types=[country, political]}, {long_name=20500, short_name=20500, types=[postal_code]}

Dans ce cas, aucun des composants sont « administrative_area_level_2 », mais dans votre cas ils pourraient être.

Vous devriez également envisager d'utiliser Array.forEach.

Espérons que cela vous aidera à déterminer quel est le problème le plus spécifique.

0

Pour ajouter aux réponses d'Aaron et de Micah, vous êtes vraiment proche, vous devez simplement choisir le premier résultat. geocode produit un tableau de résultats, mais si vous géocodez une seule adresse, le premier fonctionnera. Leur réponse utilise l'adresse de la Maison Blanche, qui semble ne pas avoir de comté, mais l'utilisation de Google HQ (comme Google a tendance à le faire par exemple) produit un résultat valable.

est ici une fonction générique pour sélectionner l'un des composants de la geocoding responses, tirant parti également indexOf pour vérifier si le composant souhaité est dans le tableau types (enregistrement d'une boucle for):

function getAddressComponent(address, component) { 
    var geo = Maps.newGeocoder().geocode(address); 
    var resultComponents = geo.results[0].address_components; 
    for (var i = 0; i < resultComponents.length; i++) { 
    if (resultComponents[i].types.indexOf(component) > -1) { 
     return resultComponents[i].long_name; 
    } 
    } 
} 

Test avec Logger, nous obtenons la valeur correcte de 'Comté de Santa Clara':

function getAddressComponent_test() { 
    var address = '1600 Amphitheatre Parkway, Mountain View, CA'; 
    Logger.log(getAddressComponent(address, 'administrative_area_level_2')); 
} 
Questions connexes