加拿大邮政编码Radius

时间:2012-12-01 01:51:29

标签: php mysql postal-code

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

使用时,我担心的是当抓取的某些邮政编码大于输入的距离时;不是太多 - 约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;
}

我有什么遗漏才能获得更准确的结果吗?

2 个答案:

答案 0 :(得分:0)

鉴于您的意见:

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

这是来自维基百科,但我已经看到它在距离其他来源+/- 3公里的范围内。 我开始质疑你是否使用great circle distance计算,但由于地球表面的曲率,这对于更长距离的准确性更为重要。

答案 1 :(得分:0)

蒂姆,你开始使用一个边界框(矩形),然后使用Haversine公式,你将得到一个半径(圆圈),如果你只想要一定距离内的人,这通常要好得多。您没有陈述自己的目的,但如果您正在寻找可能与您旅行一定距离的人,您可能需要考虑形状各异的都市区。如果是这样,请查看:Canadian Metro Areas data