Сказав все это, вы можете быстро просмотреть «Внешние ссылки» в записи Википедии о почтовых индексах в Великобритании, и я быстро нашел статью Пола Дженкинса под названием «Расчет расстояния почтового индекса в Великобритании в PHP», которая является фантастической, вы даже можете скачать ее. это здесь (uk_postcode_calc.zip).
После короткого осмотра кажется, что он делает именно то, что говорит на жестяной банке, и просто вычисляет расстояние.
Тем не менее, с помощью быстрого Google для расчета расстояния 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», мы можем быстро решить, что нам нужно вернуть.
Осталось только связать все это вместе, нам нужно создать две функции, которые будут:
Получите расстояние, используя почтовый индекс, чтобы получить долготу и широту из базы данных.
Создайте массив с почтовыми индексами в качестве ключей и расстоянием в качестве значений.
Очень просто!
Функция 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», который содержит информацию о моей базе данных и устанавливает соединение с базой данных. Я предлагаю вам сделать то же самое.
Убедитесь, что ваша база данных заполнена, вы должны иметь возможность использовать почтовый индекс Пола Дженкинса в Великобритании, позволяющий вам использовать собственную структуру таблиц.
Ну, вот и все, теперь я могу использовать этот скрипт, чтобы предоставить любые местоположения, которые соответствуют «ближайшему» почтовому индексу.