0

我正在尝试地理编码器 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"]

虽然这确实有效,但它看起来又丑又脆

有什么建议可以让这个更好吗?

4

3 回答 3

1

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

结果[0].city 结果[0].latitud

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

于 2013-05-11T03:52:03.280 回答
0

看起来不像。geometry仅在 Google Maps API 结果中定义,因为它是一个非常特定于 Google 的字段:它不仅包含坐标(地理编码器已经提取),还包含不属于地理编码器标准用途的location_typeviewport和。bounds案例:location_type与结果的精度有关,viewport专门关于 Google 如何“建议”我们在可视地图上显示此结果,并且bounds是整个城市/州/任何地方的边界框。虽然每个都与一个非常特定的用例相关,但大多数使用地理编码器的人不需要它们,因此开发人员不对它们负责,而是直接公开这些字段。所以,如果你想要一种干净的方式来访问这些字段,你'

如果您经常使用视口功能,则可能值得创建自己的Viewport类来表示这些数据,然后手动包装表达式(如Viewport.from_geometry(result.geometry))或将您自己的viewport方法修补到Geocoder::Result::Google. 你的来电。

于 2013-01-20T00:50:30.847 回答
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
于 2013-01-20T02:11:54.483 回答