我在MySQL数据库中有一个邮政编码列表,其中包含它们的纬度和经度数据(列名:ZipCode、Lat、Lon)。
现在我需要进行搜索请求(搜索邮政编码),从网站中提取信息。当我进行这些搜索请求时,结果将包括50公里半径内的所有信息。
现在,我不想进行过多的搜索请求,所以我想最小化邮政编码的数量。因此,我正在寻找一种方法来过滤所有邮政编码,以便只保留距离大于50公里的邮政编码。
不幸的是,我不知道如何做到这一点。有人能帮我解决这个问题吗?
我在MySQL数据库中有一个邮政编码列表,其中包含它们的纬度和经度数据(列名:ZipCode、Lat、Lon)。
现在我需要进行搜索请求(搜索邮政编码),从网站中提取信息。当我进行这些搜索请求时,结果将包括50公里半径内的所有信息。
现在,我不想进行过多的搜索请求,所以我想最小化邮政编码的数量。因此,我正在寻找一种方法来过滤所有邮政编码,以便只保留距离大于50公里的邮政编码。
不幸的是,我不知道如何做到这一点。有人能帮我解决这个问题吗?
您可能会对以下演示感兴趣:
作者描述了如何在MySQL中使用Haversine公式来限制搜索范围。他还介绍了如何避免针对这些查询进行完整的表扫描,而是使用纬度和经度列上的传统索引。
好吧,我看不到其他的方法,只能在每个请求上迭代所有行,并通过计算所选邮政编码与其他邮政编码之间的距离(所有邮政编码)来过滤它们,基于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.";
}
Daniel的链接涉及选择给定纬度/经度范围内50公里以内的所有邮政编码。一旦你能做到这一点,你就可以构建一个过滤后的邮政编码列表,如下所示...
你知道自己只选择了距离已选择的邮政编码>50公里的邮政编码,并且一旦原始表为空,必须是因为所有的邮政编码都在至少一个已选择的邮政编码的50公里范围内。
这并不能保证最小可能的邮政编码列表,结果的大小取决于随机选择。然而,我认为这个简单的算法很可能是“足够好的”,而且节省几次搜索并不足以证明找到一个真正最优解所需的额外努力。