Rails - 如何使用地理编码器通过IP获取当前位置

时间:2012-07-04 19:22:43

标签: ruby-on-rails ruby geocoding google-geocoder

我使用地理编码通过IP获取国家,州和城市,但Freegeoip的准确性不高。我配置了地理编码器以使用谷歌。例如:

geocoder.rb

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

但是地理编码器使用Freegeoip而不是谷歌。我不知道我是否可以使用谷歌通过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

1 个答案:

答案 0 :(得分:4)

尼尔森,

虽然使用配置的“查找”服务很好地进行地址地理编码,但不幸的是地理编码器 gem被硬编码为仅使用Freegeoip进行所有IP地址查找。我同意你的看法,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

我认为更好的解决方案是将 geoip gem(http://geoip.rubyforge.org/)与免费的MaxMind GeoCityLite数据库一起使用,或者如果您需要更高的准确度,您可以获得高级版本。我使用GeoCityLite然后Freegeoip获得更高的准确性,尽管Freegeoip声称来自同一个原始数据库...

我正在使用以下GeoIP调用来解析IP地址的位置:

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

要记住两件事:

  1. 这只能作为您当地的实时请求准确运行 网络/环回适配器不会提供适用于的IP request.remote_ip电话。

  2. 平面文件查找非常快,但我仍然不确定是否存在 是任何内存泄漏或其他可伸缩性问题的可能性。我仍然在测试这个解决方案,所以如果发现任何重要内容,我会更新回复。