【问题标题】:IP Address translated into distance from particular Zip CodeIP 地址转换为与特定邮政编码的距离
【发布时间】:2012-10-25 21:13:44
【问题描述】:

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

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

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

有没有更简单的方法来做到这一点?

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

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

谢谢

【问题讨论】:

  • 我的 IP 地址来自我的 ISP 的 DSL,该 ISP 距离酒店有 4 小时车程。永远不对。
  • 我的 isp 是国际的,有时我的 ip 查找会显示错误的国家/地区。
  • 你的意思是像 ip-tracker.org?你可以筛选一下,或者看看是否有它的 API
  • 祝手机用户好运。他们的 IP 总是一些 NAT 网关,可以从字面上远离电话的物理位置数千英里。 IP 是一种非常糟糕的方式来跟踪大量 IP 空间的位置。
  • 只有大约 6% 的流量来自移动设备,我已准备好接受这一点。尽管有关 ISP IP 查找数小时后的其他一些问题是一个更大的问题。感谢您的信息。

标签: php javascript mysql geolocation


【解决方案1】:

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

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

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

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

很酷的是它全部基于服务(Rest/JSON、XML 或 SOAP - 你可以选择),而且价格也很便宜 - 每月 15 美元。

【讨论】:

    【解决方案2】:

    有两个问题需要为您解决,(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!
    

    【讨论】:

    • 以前没见过 Movable Type 链接。好资源!
    【解决方案3】:

    您可以使用 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);
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多