加拿大邮政编码半径

Posted

技术标签:

【中文标题】加拿大邮政编码半径【英文标题】:Canadian Postal Codes Radius 【发布时间】:2012-12-01 01:51:29 【问题描述】:

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

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

为了获得更准确的结果,我还缺少什么吗?

【问题讨论】:

离他们得到的原点(纬度/经度)越远,准确度会降低吗? 不知道,我的查询主要是在20KM范围内。 实际上似乎变得更糟,当我搜索 40 公里范围时,我得到 100 公里的结果。 我相信我只是想通了。即使它说我在搜索公里,我相信它会以英里为单位。 【参考方案1】:

鉴于你的 cmets:

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

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

【讨论】:

我不敢相信它这么容易。谢谢你的半径号码! 这就是我问我最初的问题的原因 - 我想知道你是否使用 GCD,但它实际上与 20 公里以上无关! 注意:您正在使用边界框计算。因此,即使您的半正弦(又名大圆距离)公式中的半径数正确(以公里为单位),您也会在半径之外的边界框的角落获得一些命中。在人烟稀少的地区,这可能并不重要。但在纽约市或多伦多等地,它确实让事情有些混乱。【参考方案2】:

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

【讨论】:

以上是关于加拿大邮政编码半径的主要内容,如果未能解决你的问题,请参考以下文章

php 验证加拿大邮政编码

PHP 验证加拿大邮政编码

Java 加拿大邮政编码计划,

验证加拿大邮政编码

JS Regex 匹配来自字符串的加拿大邮政编码

使用正则表达式验证加拿大邮政编码