5

線がモデルに含まれている場合、ジオコーダーgemは保存時にジオコードを自動的に逆にします。after_validation :reverse_geocodeこれにより、長いテキスト文字列が住所として保存されますが、形式は「通りの名前、市の名前、郡の名前、州の名前、郵便番号、国の名前」のようになります。

after_validationこの特定のプロジェクトのストリート名にのみ興味があるので、その情報のみを保存するように呼び出しを変更する方法があるかどうか疑問に思っています。

逆ジオコーディングを手動で行うとroad、結果の値にアクセスできます。

  place = Place.first
  result = Geocoder.search("#{place.latitude},#{place.longitude}")
  street = result[0].data['address']['road']

これだけを行う独自のカスタムを設定することもできますが、すでにこれを提供しているafter_validation場合は、機能を複製したくありません。geocoder

あるいは、緯度/経度を通りの名前に変換するまったく異なる方法がある場合は、それについて聞きたいと思います。このオプションにアドレス番号またはアドレス範囲も含まれていれば問題ありません。

4

2 に答える 2

10

ジオコーディングするオブジェクトとGeocoder::Resultオブジェクトの配列を取得するブロックを提供することにより、reverse_geocodeメソッドをカスタマイズできます。

reverse_geocoded_by :latitude, :longitude do |obj,results|
  if geo = results.first
    obj.street = geo.address
  end
end

after_validation :reverse_geocode

すべてのGeocoder::Resultオブジェクト、resultは、次のデータを提供します。

result.latitude - float
result.longitude - float
result.coordinates - array of the above two
result.address - string
result.city - string
result.state - string
result.state_code - string
result.postal_code - string
result.country - string
result.country_code - string

詳細については、ジオコードのドキュメントをご覧ください。オブジェクトから取得できるフィールドをさらに見つけることができる場合もありGeocoder::Resultます。

于 2013-03-19T01:50:52.413 に答える
3

:dataメソッドを使用して、使用している選択したジオコーディングサービスのすべての属性にアクセスできます。

query = "45.679, -45.567"
result = Geocoder.search(query).first 

if (result) 
   all_attributes = result.data
end

これにより、特定の座標で使用可能なすべてのキーと値のJSON応答が返されます。Googleを使用してジオコードを逆ジオコーディングしている場合は、次のような応答が返されます。

{
         "address_components" : [
            {
               "long_name" : "1600",
               "short_name" : "1600",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Amphitheatre Pkwy",
               "short_name" : "Amphitheatre Pkwy",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Mountain View",
               "short_name" : "Mountain View",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Santa Clara County",
               "short_name" : "Santa Clara County",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "California",
               "short_name" : "CA",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "94043",
               "short_name" : "94043",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
         "geometry" : {
            "location" : {
               "lat" : 37.4224764,
               "lng" : -122.0842499
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 37.4238253802915,
                  "lng" : -122.0829009197085
               },
               "southwest" : {
                  "lat" : 37.4211274197085,
                  "lng" : -122.0855988802915
               }
            }
         },
         "place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
         "types" : [ "street_address" ]
      }

したがって、JSONをドリルダウンして、必要なものを取得します。

result.data["address_components"].each do |component|

  if component["types"].include?("route")
    street = component["long_name"]
  end

end

使用するジオコーディングサービスごとにフォーマットが異なることに注意してください。Yandexを使用した別の例を次に示します。

street = result.data["GeoObject"]["metaDataProperty"]["GeocoderMetaData"]["AddressDetails"]["Country"]["AdministrativeArea"]["SubAdministrativeArea"]["Locality"]["Thoroughfare"]["ThoroughfareName"]
于 2015-05-15T20:05:27.167 に答える