0

我想做的是能够获取用户的 IP 地址并辨别它距我的固定位置大约多少英里。我意识到通过使用服务或数据库,我可以找到城市和邮政编码,但我还想找出用户 ZIP 和我的 ZIP 之间的大致距离。

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

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

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

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

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

谢谢

4

3 回答 3

3

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

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

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

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

很酷的是它都是基于服务的(Rest/JSON、XML 或 SOAP - 你可以选择),而且它也非常便宜——每月大约 15 美元。

于 2012-10-26T18:54:51.837 回答
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);
}

希望这可以帮助。

于 2012-10-25T21:20:48.653 回答
1

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

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!
于 2012-10-25T21:21:39.743 回答