IP地址转换为特定邮政编码的距离

时间:2012-10-25 21:13:45

标签: php javascript mysql geolocation

我喜欢做的是能够获取用户的IP地址,并从我的固定位置辨别出它的近似里程数。我通过使用服务或数据库来实现我能够找到城市和邮政编码,但我还想知道用户ZIP和我的邮政编码之间的大致距离。

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

如果用户在100英里左右(基于IP),我只想展示博物馆展览的广告。如果不是,我不会展示它,因为它们似乎太遥远了。

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

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

我会对任何解决方案持开放态度,但希望在PHP / MYSQL / jQuery / Javascript领域找到一个。

由于

3 个答案:

答案 0 :(得分:3)

我公司使用的服务称为邮政编码服务。它位于https://www.zipcodeservices.com。它会完成您在问题中突出显示的所有内容。

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

  2. 您可以传入一个IP地址和一个半径的整数,它将为您提供该IP地址半径范围内的所有邮政编码。

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

    什么是酷的,它是基于服务的(Rest / JSON,XML或SOAP - 你接受你的选择),它也很便宜 - 它就像每月15美元。

答案 1 :(得分:1)

您可以使用http://www.geoiptool.com/或其他类似服务(甚至是其中一种Google 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);
}

希望这有帮助。

答案 2 :(得分:1)

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

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!