2009-10-25 5 views
2

J'utilise l'API google geocoding dans mon application, mais j'ai du mal à analyser les informations d'adresse retournées de manière fiable. J'espère que quelqu'un a une bibliothèque ou un moyen d'analyser l'information pour m'empêcher d'avoir à écrire cela moi-même et à couvrir tous les cas. Im utilisant l'API json et peut extraire la ligne d'adresse et les coordonnées assez facilement et les stocker dans une base de données, mais le problème est d'extraire les autres informations d'adresse d'une manière fiable afin que je puisse stocker. J'ai jeté un coup d'œil à la spécification d'adresse structurée XAL utilisée par google pour les données géocodées, mais mon problème est que le fait de pouvoir traiter tous les types d'adresses dans chaque pays rend difficile l'analyse du résultat.parse google geocode

Quelque chose d'aussi simple qu'un code postal peut être imbriqué assez profondément dans n'importe quelle combinaison de balises parent. même à l'intérieur d'un pays, la façon dont l'arbre apparaît peut varier, ce qui rend plus difficile que prévu d'analyser. Ironiquement, mon objectif final est de le stocker dans un arbre (pensez à rails_ acts_as_tree ou similaire) dans ma base de données, afin que les utilisateurs puissent localiser facilement les éléments plus tard. par exemple, cliquez sur le pays, l'état, puis la région, la ville, puis la banlieue etc

Im travaillant dans des rails

Répondre

2

Il y a un petit bijou et plug-in qui encapsule tout cela pour vous. C'est ce qu'on appelle GeoKit.

Il est possible de le faire utiliser Google, ou une poignée d'autres fournisseurs de services de géocodage. Si vos modèles ont les champs appropriés, il peut également faire des calculs de distance (la chose vraiment chouette est le calcul pour cela est fait dans le SQL).

Je l'utilise depuis longtemps dans l'une de mes applications de production pour calculer des distances entre les codes postaux par exemple. Comme je l'ai mentionné, je l'utilise dans la production depuis un certain temps, donc je n'ai aucune inquiétude sur la solidité du code.

+0

Merci d'avoir regardé cela. Au départ, je pensais que je ne faisais que gérer les distances entre les coordonnées et les données de géocodage brutes, mais il semble essayer au moins d'unifier les données géocodées – ADAM

1

Je l'ai fait deux ou trois fois. Leur exemple de code (Google) fonctionne, mais il est fragile - et les données de géocodage que vous recevez de Google sont au mieux incomplètes et, au pire, incohérentes.

Quoi qu'il en soit. Tous les géocodeurs sucent, mais au moins Google est gratuit et suce moins que les autres .. est-ce trop demander de la cohérence? Soupir. Essayez ce qui suit: vous lui passez un Placemark (notez que la méthode getLocations AJAX peut renvoyer plusieurs) et cela va normaliser le résultat. Si vous voulez vous faire plaisir, utilisez le champ placemark.address - à l'occasion il contiendra plus d'informations que les champs individuels. Normalement, il ne contient que le texte que vous avez réellement envoyé pour être géocodé.

function Mark(placemark) { 
    this.latitude = 0.0; 
    this.longitude = 0.0; 
    this.accuracy = 0; 
    this.country = null; 
    this.region = null; 
    this.city = null; 
    this.postalCode = null; 
    this.street = null; 
    this.address = null; 
    this.placemark = placemark; 

    if (placemark) { 
    if (placemark.Point && placemark.Point.coordinates) { 
     this.latitude = placemark.Point.coordinates[0]; 
     this.longitude = placemark.Point.coordinates[1]; 
    } 

    var elem = placemark.AddressDetails; 

    if (elem) { 
     this.accuracy = elem.Accuracy; 

     if (elem.Country) { 
     elem = elem.Country; 
     this.country = elem.CountryNameCode; 
     } 

     if (elem.AdministrativeArea) { 
     elem = elem.AdministrativeArea; 
     this.region = elem.AdministrativeAreaName; 
     } 

     if (elem.SubAdministrativeArea) { 
     elem = elem.SubAdministrativeArea; 
     } 

     if (elem.Locality) { 
     elem = elem.Locality; 
     this.city = elem.LocalityName; 
     } 

     if (elem.PostalCode) { 
     this.postalCode = elem.PostalCode.PostalCodeNumber; 
     } 

     if (elem.Thoroughfare) { 
     this.street = elem.Thoroughfare.ThoroughfareName; 
     } 
    } 
    } 
} 
+0

merci pour le code, approche intéressante faire le gros du travail avec javascript par opposition à ruby. Je vais essayer ceci – ADAM

+0

.. Je suis un imbécile, je n'ai même pas regardé les étiquettes. Mon mauvais - juste sorte de supposé que c'était une question javascript. Quand tout ce que vous avez est un marteau, etc – Maas