Question

J'utilise l'api de géocodage de Google dans mon application, mais j'ai du mal à analyser de manière fiable les informations d'adresse renvoyées. J'espère que quelqu'un a une bibliothèque ou un moyen d'analyser les informations pour m'empêcher de l'écrire moi-même et de couvrir tous les cas.

J'utilise ji api et peux extraire assez facilement la ligne d'adresse et les coordonnées et les stocker dans une base de données, mais le problème consiste à extraire les autres informations d'adresse de manière fiable afin que je puisse les stocker.

J'ai examiné la spécification d'adresse structurée XAL utilisée par Google pour les données géocodées, mais le problème est qu'elle peut prendre en charge tous les types d'adresses dans tous les pays, ce qui rend difficile l'analyse du résultat.

Quelque chose d'aussi simple qu'un code postal peut être imbriqué assez profondément dans toute combinaison de balises parent. Même à l'intérieur d'un pays, la manière dont l'arbre apparaît peut varier, ce qui rend l'analyse plus difficile que prévu.

Ironiquement, mon objectif final est de le stocker dans une arborescence (think rails acts_as_tree ou similaire) dans ma base de données, afin que les utilisateurs puissent localiser facilement les éléments ultérieurement. cliquez par exemple sur le pays, l'état, puis la région, la ville, puis la banlieue, etc.

Je travaille sur des rails

Était-ce utile?

La solution

Il existe une gemme et un plugin qui encapsule tout cela pour vous. Il s’appelle GeoKit .

Il est possible de le faire utiliser par Google ou par une poignée d'autres fournisseurs de services de géocodage. Si vos modèles ont les champs appropriés, ils peuvent également effectuer des calculs de distance (le plus intéressant est que le calcul est effectué dans le code SQL).

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

Autres conseils

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

Quoi qu'il en soit. Tous les géocodeurs craignent, mais au moins, Google est gratuit et craint moins que les autres. Est-ce trop demander de la cohérence? Soupir. Essayez ce qui suit. vous lui transmettez un repère (notez que la méthode getLocations AJAX peut renvoyer plusieurs) et il normalisera le résultat. Si vous voulez avoir du chic, utilisez le champ placemark.address - il contiendra parfois plus d’informations que les champs individuels. Normalement, il ne contiendra que le texte que vous avez réellement envoyé à 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;
      }
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top