邮编和距离

4

我在MySQL数据库中有一个邮政编码列表,其中包含它们的纬度和经度数据(列名:ZipCode、Lat、Lon)。

现在我需要进行搜索请求(搜索邮政编码),从网站中提取信息。当我进行这些搜索请求时,结果将包括50公里半径内的所有信息。

现在,我不想进行过多的搜索请求,所以我想最小化邮政编码的数量。因此,我正在寻找一种方法来过滤所有邮政编码,以便只保留距离大于50公里的邮政编码。

不幸的是,我不知道如何做到这一点。有人能帮我解决这个问题吗?


将“它们之间的距离>50公里”更改为“它们之间的距离<50公里”。我认为这是你的意思。 - Chris
@Chris 我认为>50km是有意为之的。我们希望通过尽可能少的搜索,找到一组半径为50km的搜索范围,涵盖所有邮编区域。因此,我们可以舍弃任何与我们已选取的邮编距离在50km以内的邮编,并且我们保留的邮编将会相互间隔大于50km。 - stevemegson
结果应该是一个邮政编码列表,其中两个邮政编码之间的距离>50公里。 一开始我有一个包含大量邮政编码的列表,例如10,000个邮政编码,其中许多邮政编码之间的距离非常接近。然后,我应该有一个更小的邮政编码列表(例如2000个邮政编码),它们之间的距离大于50公里。 - Jennifer Weinberg
你可以尝试在 http://gis.stackexchange.com 上提问这个问题,它是一个类似于 Stack Overflow 的地理信息系统(GIS)问题的新网站。 - fmark
6个回答

1

您可能会对以下演示感兴趣:

作者描述了如何在MySQL中使用Haversine公式来限制搜索范围。他还介绍了如何避免针对这些查询进行完整的表扫描,而是使用纬度和经度列上的传统索引。


0

好吧,我看不到其他的方法,只能在每个请求上迭代所有行,并通过计算所选邮政编码与其他邮政编码之间的距离(所有邮政编码)来过滤它们,基于Lat&Lon。

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

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

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.";
}

0
您可以使用Google地理编码API,它允许您获取两个位置(经度/纬度)之间的距离,还可以从经度/纬度获取邮政编码。通过这种方式,您应该能够获取每个邮政编码之间的距离并将它们放入表格中,然后您可以在表格上进行搜索。

你会如何在表格中存储邮政编码之间的距离?这两个邮政编码之间的距离是多少?你是说要有一个距离表,其中包含id、id(zipcode1)、id(zipcode2)、距离,并为每个2个邮政编码的组合添加一条记录吗? - Chris
不,我会有一个多对多的关系,将邮政编码与其他在50英里范围内的邮政编码相关联。或者,如果您更喜欢非规范化的方法,您可以有zipcode1和第二列是50英里范围内的邮政编码列表,如果性能至上,这将起作用。您只需要... - Joelio

0

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

  1. 随机选择一个邮政编码并将其添加到过滤列表中
  2. 删除所有位于所选邮政编码50公里以内的邮政编码
  3. 从剩余的邮政编码中随机选择一个新的邮政编码,重复此步骤直到没有更多的邮政编码为止。

你知道自己只选择了距离已选择的邮政编码>50公里的邮政编码,并且一旦原始表为空,必须是因为所有的邮政编码都在至少一个已选择的邮政编码的50公里范围内。

这并不能保证最小可能的邮政编码列表,结果的大小取决于随机选择。然而,我认为这个简单的算法很可能是“足够好的”,而且节省几次搜索并不足以证明找到一个真正最优解所需的额外努力。


0

这个问题之前已经在SO上讨论过,并提出了各种解决方案。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接