查找给定邮政编码的最近的邮政编码

时间:2011-12-08 06:46:54

标签: php postal-code

在我的php应用程序中,我想获得给定邮政编码的最近邮政编码。 这意味着我输入的邮政编码为680721我想从我的数据库中获取最近的邮政编码。

我该怎么做?

这是我用于商店邮政编码的表格。 enter image description here

enter image description here

此处varpin是邮政编码字段。

1 个答案:

答案 0 :(得分:3)

说完这一切后,快速浏览一下英国邮政编码维基百科条目中的“外部链接”,我很快发现了一篇由Paul Jenkins撰写的题为英国邮政编码距离计算的文章,很棒,你甚至可以下载它在这里(uk_postcode_calc.zip)。 经过短暂的检查,这似乎与它在锡上所说的完全相同,并且只是计算距离。 但是,通过快速google for php距离计算,您可以快速找到距离计算的更精细等价物。我认为使用其中一个可能是个好主意。 经过一些调整后,这就是我最终提出的内容:

function distance($lat1, $lon1, $lat2, $lon2, $u=’1′) {
$u=strtolower($u);
if ($u == ‘k’) { $u=1.609344; } // kilometers
elseif ($u == ‘n’) { $u=0.8684; } // nautical miles
elseif ($u == ‘m’) { $u=1; } // statute miles (default)
$d=sin(deg2rad($lat1))*sin(deg2rad($lat2))+cos(deg2rad($lat1))*cos(deg2rad($lat2))*cos(deg2rad($lon1-$lon2));
$d=rad2deg(acos($d));
$d=$d*60*1.1515;
$d=($d*$u); // apply unit
$d=round($d); // optional
return $d;
}

所以,这是完成的硬件(数据库和数学),接下来只是使用这些信息从我们提供的邮政编码数组中输入的邮政编码“找到最接近的”的情况...... 要找到“最接近”的邮政编码,我们要做的就是找到邮政编码之间的“最短”距离,或者只是结果中的最小数字,假设我们将结果放入一个数组中,并将密钥作为邮政编码和距离作为价值。 我们所要做的就是创建一个简单的脚本,它将在给定的数组中找到最小的数字,然后返回相应的键。简单!

function closest ($needle,$haystack) {
if (!$needle || !$haystack) { return; }
if (!is_array($haystack)) { return; }
$smallest=min($haystack); //smallest value
foreach ($haystack as $key => $val) {
if ($val == $smallest) { return $key; }
}
}

上面的脚本正是我们想要的,使用“min”函数我们可以快速找出我们需要返回的内容。 剩下的唯一任务是将所有这些绑定在一起,我们需要创建两个函数: 使用邮政编码获取距离以从数据库获取经度和纬度。 使用postcodes作为键创建一个数组,并将距离作为值。 非常简单! 功能1,邮政编码距离

function postcode_distance ($from,$to) {
// Settings for if you have a different database structure
$table=’postcodes_uk’;
$lat=’lat’;
$lon=’lon’;
$postcode=’postcode’;
// This is a check to ensure we have a database connection
if (!@mysql_query(‘SELECT 0′)) { return; }
// Simple regex to grab the first part of the postcode
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($from),$match);
$one=$match[0];
preg_match(‘/[A-Z]{1,2}[0-9R][0-9A-Z]?/’,strtoupper($to),$match);
$two=$match[0];
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$one’”;
$query = mysql_query($sql);
$one = mysql_fetch_row($query);
$sql = “SELECT `$lat`, `$lon` FROM `$table` WHERE `$postcode`=’$two’”;
$query = mysql_query($sql);
$two = mysql_fetch_row($query);
$distance = distance($one[0], $one[1], $two[0], $two[1]);
// For debug only…
//echo “The distance between postcode: $from and postcode: $to is $distance miles\n”;
return $distance;
}
Function 2, Postcode Closest
function postcode_closest ($needle,$haystack) {
if (!$needle || !$haystack) { return; }
if (!is_array($haystack)) { return; }
foreach ($haystack as $postcode) {
$results[$postcode]=postcode_distance($needle,$postcode);
}
return closest($needle,$results);
}

所以,完成后,将上面的4个函数放入一个文件,如“postcode.php”,准备在现实世界中使用...... 测试用例:

<?php
include_once(‘postcode.php’);
if ($_POST) {
include_once(‘db.php’);
$postcodes=array(‘TF9 9BA’,'ST4 3NP’);
$input=strtoupper($_POST['postcode']);
$closest=postcode_closest($input,$postcodes);
}
if (isset($closest)) {
echo “The closest postcode is: $closest”;
}
?>
<form action=”" method=”post”>
Postcode: <input name=”postcode” maxlength=”9″ /><br />
<input type=”submit” />
</form>

您可以在此处下载此脚本:postcode_search.phps 注意:在上面的测试用例中,我有一个“db.php”文件,其中包含我的数据库详细信息并启动数据库连接。我建议你这样做。 确保您填充了数据库,您应该能够使用Paul Jenkins的UK Postcode csv,允许您使用自己的表结构。 嗯,这就是所有人,我现在可以使用这个脚本来提供与“最接近”的邮政编码匹配的任何位置。