我使用地理编码通过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
答案 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)
要记住两件事:
这只能作为您当地的实时请求准确运行 网络/环回适配器不会提供适用于的IP request.remote_ip电话。
平面文件查找非常快,但我仍然不确定是否存在 是任何内存泄漏或其他可伸缩性问题的可能性。我仍然在测试这个解决方案,所以如果发现任何重要内容,我会更新回复。