【问题标题】:Postcode distance calculation邮编距离计算
【发布时间】:2010-09-07 09:13:06
【问题描述】:

我刚刚为我父亲的公司开发了一个邮政编码距离计算器,我们所有的客户都保存在档案中,每次有新的潜在客户进行查询时,系统都会检查所有其他客户的邮政编码。问题是它还没有进行距离计算。输入距离设置为 5 英里的 DT1 邮政编码表示 DT1、2 和 3 就在附近。 DT2 说 DT1 和 2,DT3 说 DT1、3 和 4。这没有任何意义。然而,如果我将 BH2 放入 50 英里的距离,它将带回伯恩茅斯、多切斯特、朴茨茅斯、巴斯、南安普敦和其他几个城镇。这些都是正确的 - 但是我不知道 DT 邮政编码发生了什么。 DT11 不会带回任何东西(5 英里以下),DT10 也不会(除了他们自己)。

我首先使用了 (x * x + y * y) 的根 - 我相信这被称为毕达哥拉斯定理.. 不确定,因为我已经有好几年没有使用这个词了!!

我还尝试了以下方法:

  $sinstuff = sin(deg2rad($latitude))*sin(deg2rad($latitude2));
  $cosstuff = cos(deg2rad($latitude))*cos(deg2rad($latitude2))*cos(deg2rad($longitude-$longitude2));
  $sumstuff = $sinstuff + $cosstuff;
  $acosstuff = rad2deg(acos($sumstuff));
  $distance = $acosstuff*60*1.1515; //dunno what the 60 and 1.1515 is all about - I got this formula off a website.

这个公式似乎带来了奇怪的结果。我还注意到 DT11 和 DT11 之间的确切距离类似于 +/- 0.00000989{以及许多其他数字}。这似乎也有点奇怪,因为 DT11 和它自身的距离肯定是 0...

以前有没有人成功做过类似的事情?

我确实有大量文件 - 总共约 158MB - 包含完整的每个英国邮政编码,以及相应的纬度和经度。我的目标是,而不是将指定的完整邮政编码与其他所有完整邮政编码进行比较,而是找出哪些区号小于一定距离,然后将指定的邮政编码与这些区域内的所有完整邮政编码进行比较。这有效率吗?有没有更有效的方法?

对此的任何帮助将不胜感激。

问候,

理查德

PS 我知道那里有一些网站可以告诉你如何计算距离,但我似乎无法让它们中的任何一个正常工作(从上面你可以看出)。

PPS 我知道我可以为此使用 Google API - 但这不是一个选项,因为这将是一个在本地安装的 wamp 服务器上运行的离线应用程序。它用于我们无法保证互联网连接的贸易展览。

【问题讨论】:

  • 关于+/- 0.00000989{and lots of other numbers},只是取整误差
  • 它应该仍然是 0,当然......不管计算是什么,如果数字相同,它应该是 0......当我将它四舍五入到 2 dp 时我确实知道它在0 它只是四舍五入 - 但它不应该需要四舍五入..

标签: php distance latitude-longitude postal-code


【解决方案1】:

您使用的是半正弦公式:

$l1 ==> 纬度1
$o1 ==> 经度1
$l2 ==> 纬度2
$o2 ==> 经度2

(取自http://www.go4expert.com/forums/showthread.php?t=339

函数harsine ($l1, $o1, $l2, $o2)
{
$l1 = deg2rad ($l1);
$sinl1 = sin ($l1);
$l2 = deg2rad ($l2);
$o1 = deg2rad ($o1);
$o2 = deg2rad ($o2);
return (7926 - 26 * $sinl1) * asin (min (1, 0.707106781186548 * sqrt ((1 - (sin ($l2) * $sinl1) - cos ($l1) * cos ($l2) * cos ($o2) - $o1)))));
}

这应该给你两点之间的距离。

【讨论】:

  • 看来这可能正是我使用的,但格式不同。它得出完全相同的结果 - DT1 => DT1, 2, 3; DT2 => DT1, 2; DT3 => DT1、3、4 等等。
  • 想一想,肯定使用 x * x + y * y 的根应该可以,不是吗?我的意思是通过从 lat2 中获取 lat1 和从 long2 中获取 long1 ,您正在创建两个距离。将它们用作三角形的两侧应该给出一个直角三角形,然后您可以使用 pythags theorem 计算出斜边......虽然我认为需要考虑单位转换。纬度/经度是否以米为单位?如果是这样,那么您可以只除以 1000 来获得公里或 ~1680 来获得英里。
  • 好吧,我想出了自己的公式 - 将纬度/经度转换为米,然后做 pythags theorem,然后除以一英里的米数。它仍然得出完全相同的结果。我想知道它是否是决定输出什么结果的代码导致了这个..
  • 嗯,我刚刚想到...假设 DT2 在 DT1 的左侧,DT3 在 DT1 的右侧。这样,2 和 3 将在 1 的 5 英里范围内,但 2 和 3 都不会在 5 英里范围内,而且两者都将在 1 的 5 英里范围内。我认为这可能一直都是正确的......
  • Haversine 公式只会以相同的比例为您提供两点之间的距离,因此它应该适用于所有数字。关于使用 root(xx + yy) 直到某个时刻都可以正常工作。如果您需要计算跨越格林威治或赤道的距离,您将得到负值。而且,越靠近其中一个极点,“一度”的距离也是不同的。想想看;在北极的某个地方,您可以在不到一分钟的时间内完成 360 度全方位的行走。这在赤道上更困难。
【解决方案2】:

我认为邮局有一个 Postcode-Address 文件,其中列出 每个英国邮政编码及其相关地址(不确定是否有 纬度和经度信息)。我看过这个的副本(也许 不完全最新)在各种 PC 杂志的封面光盘上 过去的。我确定您必须为最新版本付费,但您可能会 能够通过从背面检查封面光盘来获得一个起点 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多