1

我正在使用我在网上找到的以下脚本来获取给定集合坐标之间的所有邮政编码。

使用它时,我担心的是,当某些被抓取的邮政编码大于输入的距离时;不是很多 - 大约 20 公里。

function GetPostalCodes($latitude, $longitude, $range) {
    $radius = 3959;
    $north = rad2deg(asin(sin(deg2rad($latitude)) * cos($range / $radius) + cos(deg2rad($latitude)) * sin($range / $radius) * cos(deg2rad(0))));
    $south = rad2deg(asin(sin(deg2rad($latitude)) * cos($range / $radius) + cos(deg2rad($latitude)) * sin($range / $radius) * cos(deg2rad(180))));
    $east = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(90)) * sin($range / $radius) * cos(deg2rad($latitude)), cos($range / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($north))));
    $west = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(270)) * sin($range / $radius) * cos(deg2rad($latitude)), cos($range / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($north))));
    $return = DBSelectAllArrays("SELECT postal FROM postalcodes WHERE (latitude <= $north AND latitude >= $south AND longitude <= $east AND longitude >= $west)");
    krsort($return);
    if (empty($return)) return false;
    return $return;
}

为了获得更准确的结果,我是否缺少某些东西?

4

2 回答 2

0

蒂姆,您从使用边界框(矩形)开始,然后使用 Haversine 公式,您将得到一个半径(圆),如果您只希望人们在一定距离内,这通常会更好。您没有说明您的目的,但如果您正在寻找可能与您有一定距离的人,您可能需要考虑形状各异的大都市地区。如果是这样,请查看:加拿大都会区数据

于 2013-01-12T20:29:31.263 回答
0

鉴于您的评论:

$radius = 6371.0; // mean radius of Earth in km

这取自维基百科,但我从其他来源看到它在 +/- 3 公里的公差范围内。我开始质疑您是否使用了大圆距离计算,但由于地球表面的曲率,这对于更长距离的精度更为重要。

于 2012-12-01T03:10:24.463 回答