0

ジオコーダーの宝石を試して、ビューポートの結果にアクセスしようとしています。

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].都市 結果[0].緯度

result[0].methods ですべてのメソッドを参照してください

于 2013-05-11T03:52:03.280 に答える
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 に答える
0

それのように見えません。geometryは、非常に Google 固有のフィールドであるため、Google Maps API の結果でのみ定義されます。これには、座標 (ジオコーダーが既に抽出している) だけでなく、ジオコーダーの標準的な用途に含まれるとは見なされないlocation_typeviewport、およびも含まれます。boundsケース:location_type結果の精度に関係し、viewportこの結果をビジュアル マップに表示することを Google がどのように「推奨」するかのみに関係し、bounds都市/州/その他すべての境界ボックスです。それぞれが非常に特定のユースケースに関連していますが、ジオコーダーを使用するほとんどの人はそれらを必要としないため、開発者はそれらに対して責任を負わず、代わりにフィールドを直接公開します. したがって、これらのフィールドにアクセスするクリーンな方法が必要な場合は、'

ビューポート機能を頻繁に使用している場合は、Viewportこのデータを表す独自のクラスを作成してから、式を手動でラップする ( など) か、独自のメソッドを にViewport.from_geometry(result.geometry)パッチすることをお勧めします。あなたの電話。viewportGeocoder::Result::Google

于 2013-01-20T00:50:30.847 に答える