2

我在我的应用程序中使用谷歌地理编码 API,但我发现很难可靠地解析返回的地址信息。我希望有人有一个库或解析信息的方法,以防止我不得不自己写这个并涵盖每个案例。

我使用 json api,可以很容易地提取地址线和坐标并将它们存储在数据库中,但问题是以可靠的方式提取其他地址信息,以便我可以存储它。

我查看了谷歌用于地理编码数据的 XAL 结构化地址规范,但我的问题是它可以满足每个国家/地区的每种地址类型,因此很难解析结果。

像邮政编码这样简单的东西可以嵌套在父标签的任何组合中。即使在一个国家内,树的出现方式也会有所不同,这使得解析起来比预期的要难。

具有讽刺意味的是,我的最终目标是将其存储在我的数据库中的一棵树(想想 railsacts_as_tree 或类似的)中,以便用户以后可以轻松地找到这些项目。例如点击国家、州、地区、城镇、郊区等

我在铁轨上工作

4

2 回答 2

2

有一个 gem 和插件可以为您封装所有这些。它被称为GeoKit

可以使用 Google 或少数其他地理编码服务提供商。如果您的模型具有正确的字段,它还可以进行距离计算(真正巧妙的是数学是在 SQL 中完成的)。

例如,我在我的一个生产应用程序中一直使用它来计算邮政编码之间的距离。正如我所提到的,我在生产中使用它已经有一段时间了,所以我对代码的可靠性没有任何担忧。

于 2009-10-25T13:52:29.437 回答
1

我已经做过几次了。他们(谷歌的)示例代码有效,但很脆弱——你从谷歌返回的地理编码数据充其量是不完整的,最坏的情况是不一致的。

反正。所有的地理编码器都很糟糕,但至少谷歌是免费的,而且比其他的少。. 要求一致性是不是太过分了?叹。尝试以下操作;您将一个 Placemark 传递给它(注意 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 回答