邮政编码距离计算

时间:2010-09-07 09:13:06

标签: php distance latitude-longitude postal-code

我刚刚为我的爸爸公司开发了一个邮政编码距离计算器,我们所有的客户都保存在档案中,每当有新的潜在客户进行查询时,系统都会检查所有其他客户的邮政编码。问题是它还没有进行距离计算。输入距离设置为5英里的DT1邮政编码表示DT1,2和3靠近。 DT2表示DT1和2,DT3表示DT1,3和4.这没有任何意义。然而,如果我把距离50英里的BH2放进去,它将带回伯恩茅斯,多切斯特,朴茨茅斯,巴斯,南安普敦和其他几个城镇。这些都是正确的 - 但我不知道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服务器上运行的脱机应用程序。它用于贸易展览,我们无法保证互联网连接。

2 个答案:

答案 0 :(得分:1)

您使用的是半身定制公式:

$ l1 ==> latitude1
$ o1 ==> longitude1
$ l2 ==> latitude2
$ o2 ==> longitude2

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

function haversine ($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)))));
}

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

答案 1 :(得分:1)

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