0

我刚刚为我爸爸的公司开发了一个邮政编码距离计算器,我们所有的客户都保存在档案中,每次有新的潜在客户进行查询时,系统都会检查所有其他客户的邮政编码。问题是它还没有进行距离计算。输入距离设置为 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 服务器上运行的离线应用程序。它用于我们无法保证互联网连接的贸易展览。

4

2 回答 2

1

您使用的是半正弦公式:

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

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

函数 hasrsine ($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)))));
}

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

于 2010-09-07T10:08:27.597 回答
1

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

于 2011-07-05T08:19:20.657 回答