2

アプリでGoogleジオコーディングAPIを使用していますが、返された住所情報を確実に解析するのが難しいと感じています。私がこれを自分で書いてすべてのケースをカバーする必要がないように、誰かがライブラリまたは情報を解析する方法を持っていることを願っています。

私はjsonapiを使用しており、アドレス行と座標を簡単に抽出してデータベースに保存できますが、問題は他のアドレス情報を信頼できる方法で抽出して保存できるようにすることです。

Googleがジオコーディングされたデータに使用するXAL構造化住所の仕様を見てきましたが、私の問題は、すべての国のすべての住所タイプに対応できるため、結果の解析が困難になることです。

郵便番号のような単純なものは、親タグの任意の組み合わせのかなり奥深くにネストできます。ある国の中でさえ、木の見た目は変わる可能性があり、それが解析を予想よりも難しくします。

皮肉なことに、私の最終目的は、ユーザーが後で簡単にアイテムを見つけられるように、データベースのツリー(railsacts_as_treeなど)に保存することです。たとえば、国、州、地域、町、郊外などをクリックします

私はレールで働いています

4

2 に答える 2

2

これらすべてをカプセル化する宝石とプラグインがあります。それはGeoKitと呼ばれます。

Google、または他のいくつかのジオコーディング サービス プロバイダーを使用することが可能です。モデルに適切なフィールドがあれば、距離の計算も行うことができます (本当にすばらしいのは、この計算が SQL で行われることです)。

たとえば、郵便番号間の距離を計算するために、本番アプリケーションの1つで長い間使用しています。前述したように、私はかなり長い間本番環境で使用してきたので、コードの健全性については何の懸念もありません。

于 2009-10-25T13:52:29.437 に答える
1

私はこれを数回行いました。彼らの(Googleの)サンプルコードは機能しますが、脆弱です-そして、Googleから返されるジオコーディングデータは、せいぜい不完全で、最悪の場合、一貫性がありません。

ともかく。すべてのジオコーダーは最悪ですが、少なくともGoogleは無料で、他のジオコーダーよりも最悪です。一貫性を求めるのは多すぎますか?はぁ。次のことを試してください。プレースマークを渡すと(getLocations AJAXメソッドが複数を返す場合があることに注意してください)、結果が正規化されます。凝ったものにしたい場合は、placemark.addressフィールドを使用してください。個々のフィールドよりも多くの情報が含まれる場合があります。通常、ジオコーディングするために実際に送信したテキストのみが含まれます。

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;
      }
    }
  }
}
于 2009-10-25T05:38:04.243 に答える