Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 邮政编码距离计算_Php_Distance_Latitude Longitude_Postal Code - Fatal编程技术网

Php 邮政编码距离计算

Php 邮政编码距离计算,php,distance,latitude-longitude,postal-code,Php,Distance,Latitude Longitude,Postal Code,我刚刚为我父亲的公司开发了一个邮政编码距离计算器,我们所有的客户都被存档,每次新的潜在客户询问时,系统都会对照所有其他客户的邮政编码进行检查。问题是它还没有进行距离计算。键入距离设置为5英里的DT1邮政编码表示DT1、2和3就在附近。DT2表示DT1和2,DT3表示DT1、3和4。这没有任何意义。然而,如果我把BH2放在距离50英里的地方,它将带回伯恩茅斯、多切斯特、朴茨茅斯、巴斯、南安普敦和其他几个城镇。这些都是正确的-但是我不知道DT邮政编码是怎么回事。DT11没有带回任何数据(5英里以下)

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

您使用的是哈弗森公式:

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

(摘自)

函数haversine($l1、$o1、$l2、$o2)
{
$l1=deg2rad($l1);
$sinl1=sin($l1);
$l2=deg2rad($l2);
$o1=deg2rad($o1);
$o2=deg2rad($o2);
回报(7926-26*$sinl1)*asin(最小(1,0.707106781186548*sqrt((1-(sin($l2)*$sinl1)-cos($l1)*$cos($l2)*$cos($o2-$o1 k);
}

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

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

关于
+/-0.00000989{和许多其他数字}
,这只是一个舍入错误,应该仍然是0,当然。。。无论计算结果如何,如果数字相同,则应为0。。。当我把它四舍五入到2 dp时,我确实认为它只是四舍五入-但它不需要四舍五入..看起来这可能正是我使用的,但格式不同。它得出了完全相同的结果——DT1=>DT1,2,3;DT2=>DT1,2;DT3=>DT1、3、4等等。想想看,使用x*x+y*y的根肯定会有用,不是吗?我的意思是,从lat2取lat1,从long2取long1,你就创造了两个距离。用它们作为三角形的两边,应该得到一个直角三角形,你可以用毕达格定理来计算斜边。。。虽然我认为有单位的转换要考虑。是否以米为单位,按概率计算?如果是这样的话,你可以除以1000得到公里,或者除以1680得到英里。我已经提出了我自己的公式——把lat/long转换成米,然后用毕达格定理,然后除以一英里中的米数。它仍然得出完全相同的结果。我想知道是不是代码决定了输出的结果导致了这个…嗯,我只是有个想法。。。假设DT2在DT1的左边,DT3在DT1的右边。这样,2和3将在1的5英里范围内,但2和3都不会在彼此的5英里范围内,并且两者都将在1的5英里范围内。我想这可能一直都是正确的…哈弗森公式只会给出两点之间的距离,在相同的尺度下,所以它应该适用于所有数字。关于使用根(xx+yy)直到某一时刻都可以正常工作。如果你需要计算跨越格林威治或赤道的距离,你会得到负值。此外,靠近其中一个极点,“一度”的距离是不同的。想想看;在北极的某个地方,你可以在不到一分钟内走完360度。在赤道上更难。 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)))));
}