我正在尝试地理编码器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"]
虽然这确实有效但看起来很丑陋而且很脆弱
有关改善这一点的建议吗?
答案 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