如何通过地理编码器宝石获取完整的街道地址?

时间:2015-06-28 02:53:56

标签: ruby google-maps google-maps-api-3 google-geocoder street-address

我正在使用geocoder与Google一起验证地址,如果它们被略微提取以及获取经度和经度,则会返回正确的值。我想我在这里的实施可能有点偏差,因为它感觉很笨重,而且我发现有些地址错过了街道号码。

我开始使用以下代码:

result = Geocoder.search(full_address_to_verify)
if result != []
  street_address = result[0].address_components[1]["long_name"]
  city = result[0].address_components[2]["long_name"]
  state = result[0].address_components[5]["long_name"]
  zip = result[0].address_components[7]["long_name"]
end  

我发现有时候会得到多个结果,所以我会选择第一个([0]以上)。此外,我发现一些奇怪的是,大部分时间result[0].address_components[1]包含完整的地址,包括street_number,但偶尔它没有,我必须添加result[0].address_components[0]。我还没有找到一个押韵或理由。

最终我的目标是将美国街道号+街道,城市,州和邮政编码字段检索为单独的变量。

所以我的问题是,有没有更好的方法来检索地址,以便街道号始终与路线正确关联?

从文档中我没有真正看到任何干净的方法,只是简单地给我所需的地址字段而不从请求回复中的各个字段中提取数据......

2 个答案:

答案 0 :(得分:0)

是的,address_components应该使您能够完成您想要完成的任务。对于rhyme,您可以参考this part of the documentation about address type

Google Maps API通过在此位置放置字符串来标记此字段所属的组件类型:

result[0].address_components[i].types[0]

您应该根据类型获得相应的值,而不是address_components的位置。

这就是Google在Places Autocomplete API demo中找到它的方式:

var componentForm = {
  street_number: 'short_name',
  route: 'long_name',
  locality: 'long_name',
  administrative_area_level_1: 'short_name',
  country: 'long_name',
  postal_code: 'short_name'
};
...
...
  // Get each component of the address from the place details
  // and fill the corresponding field on the form.
  for (var i = 0; i < place.address_components.length; i++) {
    var addressType = place.address_components[i].types[0];
    if (componentForm[addressType]) {
      var val = place.address_components[i][componentForm[addressType]];
      document.getElementById(addressType).value = val;
    }
  }

答案 1 :(得分:0)

参加聚会晚了几年。使用嵌套的 address_components 从 google geocoding API 中提取地址很简单,而且相当麻烦。

幸运的是,geocoder gem 具有访问地址信息的内置方法。在 docs 上阅读更多内容。