2

ジオコードを使用してIP経由で国、州、都市を取得していますが、Freegeoipの精度は高くありません。Googleを使用するようにジオコーダーを構成しました。例:

geocoder.rb

Geocoder.configure do |config|
  config.lookup = :google
  config.api_key = "API_KEY"
  config.timeout = 5
  config.units = :km
end

ただし、ジオコーダーはgoogleではなくFreegeoipを使用します。Googleを使用してIP経由で国、州、都市を取得できるかどうかはわかりません。どのジオコーダープロバイダーがGEOIPを使用できますか?

my_controller.rb

@result = request.location.to_yaml

見る

--- !ruby/object:Geocoder::Result::Freegeoip cache_hit: data: city: Caxias Do Sul region_code: "23" region_name: Rio Grande do Sul metrocode: "" zipcode: "" longitude: "-51.1833" latitude: "-29.1667" country_code: BR ip: 201.22.227.49 country_name: Brazil
4

1 に答える 1

4

ニールセン、

構成された「ルックアップ」サービスを使用したアドレスジオコーディングには最適ですが、残念ながら、ジオコーダーgemは、すべてのIPアドレスルックアップにFreegeoipのみを使用するようにハードコーディングされています。そして、Freeogeoipの精度はかなり低い(私のユースケースには十分ではない)ことに同意します。

geocoder.rbから:

def lookup(query)
if ip_address?(query)
  get_lookup(ip_lookups.first)
else
  get_lookup(Configuration.lookup || street_lookups.first)
end
end

 ##
 # All IP address lookups, default first.
 #
 def ip_lookups
   [:freegeoip]
end

より良い解決策は、無料のMaxMindGeoCityLiteデータベースでgeoipgem(http://geoip.rubyforge.org/)を使用することですさらに精度が必要な場合は、プレミアムバージョンを入手できます。Freegeoipは同じ元のデータベースから派生していると主張していますが、GeoCityLiteよりもFreegeoipの方がはるかに精度が高くなっています...

次のGeoIP呼び出しを使用して、IPアドレスの場所を解決しています。

@geoip_city = GeoIP.new('lib/GeoLiteCity.dat').city(request.remote_ip)

覚えておくべき2つのことがあります:

  1. ローカルネットワーク/ループバックアダプタはrequest.remote_ip呼び出しで機能するIPを提供しないため、これはライブリクエストでのみ正確に機能します。

  2. フラットファイルルックアップは非常に高速ですが、メモリリークやその他のスケーラビリティの問題が発生する可能性があるかどうかはまだわかりません。私はまだこのソリューションをテストしているので、何か重要なことがわかったら応答を更新します。

于 2012-09-13T23:36:44.253 に答える