2015-04-05 119 views
0

我想将两个IPv4地址转换为经度和纬度,然后计算它们之间的地理距离。Rails:Geokit错误地将IPv4地址转换为经度和纬度

Geokit说它可以做到这一点。

西雅图:

a = Geokit::Geocoders::GoogleGeocoder.geocode("207.244.147.34")

a.lat => 37.0483944,a.lng => 37.3421261(应为47.5839,-122.2995)

编辑:下面好的是IP地址英国不是SF,但它仍然是英国而不是土耳其。

旧金山:

b = Geokit::Geocoders::GoogleGeocoder.geocode("5.68.123.155")

a.lat => 14.6478672,a.lng => 120.9880659(应为37.7691,-122.4449)

a.distance_to(b)返回5273.737623217472。

西雅图显然到圣弗朗西斯科有点超过5000英里,我得到很多机票。

我错过了什么?

+0

检查更新的答案,了解如何通过ip查找位置。 – 2015-04-05 18:02:27

+0

GeoIP永远不会完全准确,并且会出现像这样的错误。不存在每个IP地址准确映射到确切位置的数据库。 – 2015-04-06 10:00:25

+0

@SanderSteffann谢谢你。如果这种方法本身容易出错,那么除了将twp IP转换为lat,lng和计算距离外,您是否知道检测VPN使用的最佳做法? – gr8scott06 2015-04-07 03:11:56

回答

0

ab如您使用的是不符合SeattleSan Franscisco

> a.city 
=> "Gaziantep" 
> a.country 
=> "Turkey" 
> b.city 
=> "Caloocan" 
> b.country 
=> "Philippines" 

尝试:

> Geocoder.configure(ip_lookup: :freegeoip) 
> a = Geocoder.search("74.200.247.59").first 
=> #<Geocoder::Result::Freegeoip:0x007fc6df3cf930 @data={"ip"=>"207.244.147.34", "country_code"=>"US", "country_name"=>"United States", "region_code"=>"WA", "region_name"=>"Washington", "city"=>"Seattle", "zip_code"=>"98103", "time_zone"=>"America/Los_Angeles", "latitude"=>47.674, "longitude"=>-122.342, "metro_code"=>819}, @cache_hit=nil> 
> b = ... 

https://github.com/alexreisner/geocoder/blob/091032059e6b47285e2be5ef82ad8b016f362069/test/unit/lookups/freegeoip_test.rb的使用示例。

+0

你是否建议我使用gem'geocoder'?查看该文档以确定可以运行的距离:a = Geocoder.coordinates(“207.244.147.34”); b = Geocoder.coordinates(“5.68.123.155”); distance = Geocoder :: Calculations.distance_between(a,b) – gr8scott06 2015-04-05 20:00:22

+0

在“避免不必要的API请求”下的地理编码器文档中提到了api使用配额,但未指定数量。你知道配额还是遇到问题?谢谢 – gr8scott06 2015-04-05 20:02:46