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

How to get the full street address via the geocoder gem?

我正在使用 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] .我还没有想出一个押韵或理由。

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

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

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

没错,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;
    }
  }

聚会晚了几年。从 google 地理编码 API 中提取地址很简单,但对于嵌套的 address_components.

来说相当麻烦

幸运的是,地理编码器 gem 具有访问地址信息的内置方法。在 docs.

上阅读更多内容