2010-09-07 97 views
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服务器上运行的离线应用程序。它适用于我们无法保证互联网连接的贸易展会。

+0

约+/- 0.00000989 {和很多其他数字}',这只是一个舍入误差 – 2010-09-07 09:21:01

+0

它应该仍然是0,当然...无论计算是如果数字是相同的,它应该是0 .. 。当我把它变成2dp时,我发现了它,它在0时表示它只是四舍五入 - 但它不应该需要四舍五入。 – ClarkeyBoy 2010-09-07 09:33:32

回答

1

你使用haversine公式:

$ L1 ==> latitude1
$ 01 ==> 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)))));
}

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

+0

看起来这可能正是我正在使用的,但以不同的格式。它出现了完全相同的结果 - DT1 => DT1,2,3; DT2 => DT1,2; DT3 => DT1,3,4等等 – ClarkeyBoy 2010-09-07 10:33:18

+0

想想吧,当然使用x * x + y * y的根应该可以工作,不应该吗?我的意思是通过从lat2获取lat1和从long2获取long1,您将创建两个距离。将这些用作三角形的两边应该给出一个直角三角形,然后你可以使用pythags定理来计算斜边......尽管我认为有单位转换需要考虑。纬度/长度以米为单位,每个机会?如果是这样,那么你可以用1000除以得到km或〜1680来获得里程。 – ClarkeyBoy 2010-09-07 10:43:27

+0

那么我已经提出了自己的公式 - 将经纬度转换为米,然后执行pythags定理,然后除以一英里的米数。它仍然会产生完全相同的结果。我想知道是否它的代码决定了什么结果输出是造成这.. – ClarkeyBoy 2010-09-07 10:55:50

1

我认为邮局维护一个邮政编码地址文件,其中列出每个英国邮政编码及其相关地址(不知道它是否有 经度和纬度信息) 。我在 以前的各种PC杂志的封面光盘上看到过这些副本(可能不是最新的 )。我确定你必须支付最新版本,但你可能是 可以从 问题中查看封面光盘来获得起点。