Нахождение ближайшего почтового индекса данного почтового индекса - PullRequest
1 голос
/ 08 декабря 2011

В моем приложении php я хочу получить ближайший почтовый индекс для данного почтового индекса.Это означает, что я ввожу почтовый индекс как 680721 Я хочу получить ближайший почтовый индекс этого из моей базы данных.

Как я могу это сделать?

Это таблица, для которой я использовалхранить почтовые индексы.enter image description here

enter image description here

Здесь varpin - поле почтового индекса.

1 Ответ

3 голосов
/ 08 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...