访问地理编码器结果

时间:2013-01-20 00:16:21

标签: ruby-on-rails ruby

我正在尝试地理编码器gem并希望加入视口结果。

成为Ruby的新手是有更好的方法来访问结果。

result = Geocoder.search("New York, NY").map(&:geometry)
north_east_lat = result[0]["viewport"]["northeast"]["lat"]
north_east_lng = result[0]["viewport"]["northeast"]["lng"]

虽然这确实有效但看起来很丑陋而且很脆弱

有关改善这一点的建议吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Geocoder :: Result方法访问该数据,例如:

结果[0]。市 结果[0] .latitud

查看所有方法,结果[0] .methods

答案 1 :(得分:0)

看起来不像。 geometry仅在Google Maps API结果中定义,因为它是特定于Google的字段:它不仅包含坐标(地理编码器已提取),还包含location_type,{ {1}}和viewport,它们不属于地理编码器的标准用例:bounds与结果的精确度location_type有关。完全是关于Google"如何推荐"我们在可视化地图上显示此结果,viewport是整个城市/州/任何地方的边界框。虽然每个人都在一个非常特殊的用例中相关,但大多数使用地理编码器的人并不需要它们,因此开发人员不会对它们负责,而是直接暴露这些字段。因此,如果您想要一种干净的方式来访问这些字段,您必须自己构建它。

如果您经常使用视口功能,则可能需要创建自己的bounds类来表示此数据,然后手动包装表达式(如Viewport)或修补将Viewport.from_geometry(result.geometry)方法设置为viewport。你的电话。

答案 2 :(得分:0)

据我所知,geometry数据只是一个简单的Hash。如果您不喜欢在多个级别按[[key]]访问值的方式,可以将Hash转换为OpenStruct。

require 'ostruct'

result = Geocoder.search("New York, NY").first
# singleton class http://www.devalot.com/articles/2008/09/ruby-singleton
class << result
  def ostructic_geometry
    ostructly_deep self.geometry
  end

  private
    def ostructly_deep(hash)
      root = OpenStruct.new

      # http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html#method-i-marshal_load
      # -- from the user comment at the bottom --
      # In the marchal_load() example, the Hash should have symbols as keys:
      # hash = { :time => Time.now, :title => 'Birthday Party' }
      load_data = hash.each_pair.inject({}) do |all, (key, value)|
        value = ostructly_deep(value) if value.is_a?(Hash)
        all[key.to_sym] = value # keys need to be symbols to load
        all
      end

      root.marshal_load load_data
      root
    end
end

now_you_can_call_value_from_member_geometry = result.ostructic_geometry
now_you_can_call_value_from_member_geometry.bounds.northeast.lat # => 40.9152414