2012-10-25 75 views
0

我想要做的是能够抓取用户IP地址并辨别出距离我的固定位置有多少个近似里程。我意识到通过使用服务或数据库,我可以找到城市和邮政编码,但我也想知道用户ZIP和我的ZIP之间的大致距离。将IP地址转换为距离特定邮政编码

我见过一个服务和数据库从用户IP获取Zip/City/Country。我还使用了一些PHP类来获得从一个邮政编码到另一个邮政编码的距离。假设我可以使用一个数据库来获取zip,而另一个可以比较两个zip之间的距离,但这看起来非常耗费资源(至少有两个查询加处理)。

我只是想展示一个博物馆展览的广告,如果用户在100英里以内(基于IP)。如果不是,我不会展示它,因为它好像太远了。

有没有更简单的方法来实现这个目标?

此外,我不希望浏览器通过使用新的HTML5内容来询问用户是否可以在我的应用程序中使用他们的地理位置。我宁愿这一切都发生在没有基于位置的意识(和用户Opt-In)的幕后,除非有一个压倒性的理由来使用它。

我会接受任何解决方案,但希望在PHP/MYSQL/jQuery/Javascript领域找到一个解决方案。

感谢

+1

我的IP地址来自我的ISP,它距离我们的ISP有4个小时的车程。这是不对的。 –

+1

我的isp是国际性的,有时我的ip查找显示错误的国家。 – 2012-10-25 21:18:08

+0

你的意思是像ip-tracker.org?你可以屏幕刮或看看是否有一个API为它 – rws907

回答

3

有一个我公司使用名为邮编Services服务。它位于https://www.zipcodeservices.com。它会处理您在问题中突出显示的所有内容。

  1. 您可以获得2个邮政编码之间的距离。

  2. 您可以传递一个IP地址和一个半径的整数,它将为您提供该IP地址半径内的所有zip代码。

我们实际上使用邮政编码服务IP地址和邮政编码服务来向我们的网站查看者显示地理位置广告。

最酷的是它都是基于服务的(Rest/JSON,XML或SOAP--你可以自己选择),而且它也相当便宜 - 它就像一个月15美元一样。

1

您可以使用类似http://www.geoiptool.com/或其他类似的服务(谷歌的API甚至一个)。

然后,因为它提供经纬度坐标,只需使用以下函数将距离映射到您自己的距离。但要小心 - IP地址的一些纬度/长度的坐标是远离目标的,并且不会与移动设备/小区关联。 IP的不漫游:

function distance($lat1, $lng1, $lat2, $lng2, $miles = true) 
{ 
     $pi80 = M_PI/180; 
     $lat1 *= $pi80; 
     $lng1 *= $pi80; 
     $lat2 *= $pi80; 
     $lng2 *= $pi80; 

     $r = 6372.797; // mean radius of Earth in km 
     $dlat = $lat2 - $lat1; 
     $dlng = $lng2 - $lng1; 
     $a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlng/2) * sin($dlng/2); 
     $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
     $km = $r * $c; 

     return ($miles ? ($km * 0.621371192) : $km); 
} 

希望这有助于。

1

有两个问题需要解决:(1)获取用户的纬度/经度;(2)计算距离。对于(2),要使用haversine公式:

http://www.movable-type.co.uk/scripts/latlong.html

a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2) 
c = 2.atan2(√a, √(1−a)) 
d = R.c 
where φ is latitude, λ is longitude, R is earth’s radius (mean radius = 6,371km) 
note that angles need to be in radians to pass to trig functions! 
+0

之前没有看到Movable Type链接。良好的资源! – nickhar