我喜欢做的是能够获取用户的IP地址,并从我的固定位置辨别出它的近似里程数。我通过使用服务或数据库来实现我能够找到城市和邮政编码,但我还想知道用户ZIP和我的邮政编码之间的大致距离。
我见过一个服务和数据库,用于从用户IP获取Zip / City / Country。我还使用了一些PHP类来获取从一个邮政编码到另一个邮政编码的距离。假设我可以使用一个数据库来获取zip,另一个用来比较两个拉链之间的距离,但这似乎非常耗费资源(至少有2个查询加上处理)。
如果用户在100英里左右(基于IP),我只想展示博物馆展览的广告。如果不是,我不会展示它,因为它们似乎太遥远了。
有没有更简单的方法来实现这一目标?
此外,我不希望浏览器通过使用新的HTML5内容询问用户是否可以在我的应用程序中使用其地理位置。我宁愿这一切都发生在没有基于位置的意识(和用户选择)的幕后,除非有一个压倒性的理由使用它。
我会对任何解决方案持开放态度,但希望在PHP / MYSQL / jQuery / Javascript领域找到一个。
由于
答案 0 :(得分:3)
我公司使用的服务称为邮政编码服务。它位于https://www.zipcodeservices.com。它会完成您在问题中突出显示的所有内容。
您可以获得2个邮政编码之间的距离。
您可以传入一个IP地址和一个半径的整数,它将为您提供该IP地址半径范围内的所有邮政编码。
我们实际上使用邮政编码服务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!