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

Php IP地址转换为与特定邮政编码的距离,php,javascript,mysql,geolocation,Php,Javascript,Mysql,Geolocation,我想做的是能够抓取一个用户的IP地址,并辨别它距离我的固定位置大约有多少英里。我意识到,通过使用服务或数据库,我可以找到城市和邮政编码,但我也想找出用户zip和我的zip之间的大致距离 我看到一个服务和数据库从用户IP获取Zip/城市/国家。我还使用了一些PHP类来计算从一个邮政编码到另一个邮政编码的距离。假设我可以使用一个数据库来获取zip,另一个数据库来比较两个zip之间的距离,但这似乎需要大量资源(至少2个查询加上处理) 我只想显示一个博物馆展览的广告,如果用户在100英里左右(基于IP)

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

我看到一个服务和数据库从用户IP获取Zip/城市/国家。我还使用了一些PHP类来计算从一个邮政编码到另一个邮政编码的距离。假设我可以使用一个数据库来获取zip,另一个数据库来比较两个zip之间的距离,但这似乎需要大量资源(至少2个查询加上处理)

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

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

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

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


谢谢

您可以使用类似的或其他类似的服务(甚至是一个谷歌API)

然后,由于它提供了横向/纵向坐标,只需使用以下函数将距离映射到您自己的坐标。不过要小心-一些IP地址的lat/long坐标远离目标,并且根本不会与手机/小区相关。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);
}

希望这有帮助。

您可以使用类似的服务或其他类似的服务(甚至是一个谷歌API)

然后,由于它提供了横向/纵向坐标,只需使用以下函数将距离映射到您自己的坐标。不过要小心-一些IP地址的lat/long坐标远离目标,并且根本不会与手机/小区相关。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)获取用户的纬度/经度,(2)计算距离。对于(2),您希望使用哈弗森公式:


有两个问题需要解决,(1)获取用户的lat/lon和(2)计算距离。对于(2),您希望使用哈弗森公式:


我的公司使用一种叫做邮政编码服务的服务。它位于。它做了你在问题中强调的所有事情

  • 您可以获得两个邮政编码之间的距离

  • 您可以在中传递一个IP地址,并为radius传递一个整数,它将为您提供该IP地址半径内的所有zipcodes

  • 我们实际上使用邮政编码服务IP地址和邮政编码服务向我们的网站观众显示地理位置的广告


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

    我的公司使用一种叫做邮政编码服务的服务。它位于。它做了你在问题中强调的所有事情

  • 您可以获得两个邮政编码之间的距离

  • 您可以在中传递一个IP地址,并为radius传递一个整数,它将为您提供该IP地址半径内的所有zipcodes

  • 我们实际上使用邮政编码服务IP地址和邮政编码服务向我们的网站观众显示地理位置的广告


    最酷的是,它都是基于服务的(Rest/JSON、XML或SOAP,由你自己选择),而且也很便宜——每月15美元。

    我的IP地址来自ISP的DSL,离ISP只有4小时车程。这从来都不对。我的isp是国际性的,有时我的ip查找显示错误的国家。你是说像ip-tracker.org?你可以对其进行筛选,或者看看是否有API,祝手机用户好运。他们的IP总是某种NAT网关,它可以从手机的物理位置上千里之外。IP是一种非常糟糕的方式来跟踪一大片IP空间的位置。我只有大约6%的流量来自移动设备,我准备接受这一点。尽管ISP IP查找需要几个小时才能完成的其他一些问题是一个更大的问题。谢谢你提供的信息。我的IP地址来自我的ISP的DSL,离我只有4小时车程。这从来都不对。我的isp是国际性的,有时我的ip查找显示错误的国家。你是说像ip-tracker.org?你可以对其进行筛选,或者看看是否有API,祝手机用户好运。他们的IP总是某种NAT网关,它可以从手机的物理位置上千里之外。IP是一种非常糟糕的方式来跟踪一大片IP空间的位置。我只有大约6%的流量来自移动设备,我准备接受这一点。尽管ISP IP查找需要几个小时才能完成的其他一些问题是一个更大的问题。谢谢你的信息。我以前没见过活字链接。好资源!以前从未见过活字链接。好资源!