Zipcodes&距离

时间:2010-08-19 11:56:29

标签: mysql geolocation distance latitude-longitude

我在MySQL数据库中有一个zipcoded列表以及他们的Latitude&经度数据(列名:ZipCode,Lat,Lon)。

现在我必须发出搜索请求(搜索邮政编码)以从网站中提取信息。当我发出此搜索请求时,结果包含邮政编码半径50公里范围内的所有信息。

现在,我不想提出大量的搜索请求,因此我希望尽量减少zipcodes的数量。所以我正在寻找一种方法来过滤所有的拉链码,这样我只有拉链码,它们之间的距离大于50公里。

不幸的是我不知道该怎么做。 有人可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:1)

您可能有兴趣查看以下演示文稿:

作者描述了如何使用MySQL中的Haversine Formula将搜索限制在一个定义的范围内。他还介绍了如何使用纬度和经度列上的传统索引来避免对此类查询进行全表扫描。

答案 1 :(得分:0)

你可以使用google geocoding api,它允许你获得2个位置之间的距离(纬度/长度,它也允许你从纬度/长度获得拉链)。从这里你应该能够获得每个邮政编码之间的距离并将它们放入表中,然后你就可以对它们进行搜索。

答案 2 :(得分:0)

好吧,我认为没有其他方法可以迭代每个请求上的所有行,并通过计算所选邮政编码与其他邮件之间的距离(所有这些)来过滤它们,基于Lat&经度。

我正在使用类似的东西...... http://webarto.com/googlemaps http://webarto.com/izrada-web-stranica/belgrade

两个LL之间距离的PHP函数......

function distance($lat1, $lon1, $lat2, $lon2){ 
  $theta = $lon1 - $lon2; 
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
  $dist = acos($dist); 
  $dist = rad2deg($dist); 
  $miles = $dist * 60 * 1.1515;
  return round($miles * 1.609344,3);
}

我这样计算......

$sql = mysql_query("SELECT * FROM geoip WHERE city = '$city'");
while($row = mysql_fetch_array($sql)){
    $ll = explode(",",$row["ll"]);
    $x = distance(44.5428009033,18.6693992615,$ll[0],$ll[1]);
    $road = intval($x+($x/3));

    echo "Distance between ".$row["city"]." and Tuzla is ".$x." kilometers of airline, that's about ".$road." kilometers of road way.";
}

答案 3 :(得分:0)

Daniel的链接涉及选择给定纬度/经度50公里范围内的所有邮政编码。一旦你能做到这一点,你可以建立一个像这样的过滤器列表...

  1. 随机选择一个邮政编码并将其添加到已过滤的列表
  2. 删除位于所选邮政编码50公里范围内的所有邮政编码
  3. 从剩余的邮政编码中随机选择一个新的邮政编码,重复直到不再剩下。
  4. 你知道你只挑选距离已经挑选的邮政编码大约50公里的邮政编码,而且你知道一旦原始表格为空,它必须是因为所有邮政编码都位于至少一个邮政编码的50公里范围内选择的邮政编码。

    这并不保证最小的邮政编码列表,结果的大小取决于随机选择。但是,我认为这个简单的算法可能“足够好”,并且保存一些搜索并不能证明找到真正最优解决方案所需的额外工作是合理的。

答案 4 :(得分:0)

此问题已在前面讨论here on SO并提供了各种解决方案

答案 5 :(得分:0)

我遇到了类似的问题,我用这个解决方案找到答案。不确定您是使用java还是其他语言,但逻辑可以用于任何编程语言 Geo Location API and finding user within a radius