2

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

地理编码器.rb

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

但是地理编码器使用的是 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 被硬编码为仅使用 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. 这只会在实时请求上准确工作,因为您的本地网络/环回适配器不会提供适用于 request.remote_ip 调用的 IP。

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

于 2012-09-13T23:36:44.253 回答