Почтовый индекс Радиус поиска

Итак, меня попросили создать скрипт поиска по почтовому индексу. Я все еще довольно плохо знаком с более продвинутым php / mysql. Все, что мне нужно, это помочь упростить этот скрипт. База данных почтовых индексов представляет собой всю базу данных почтовых индексов Великобритании длиной 1,3 млн. Строк. Поэтому, когда я использую скрипт для получения всех почтовых индексов в радиусе, это занимает много времени. Есть ли способ упростить это. Возможно даже использовать Java / Ajax?

<?php

$postcode = str_replace( '+', '%20', $postcode );
$postcode = str_replace( '!"£$^&*()?<>', '', $postcode );

include ('config.php');

$sqlstring = "SELECT * FROM postcodelatlng WHERE postcode LIKE '".$postcode." %' ";
$result = mysql_query($sqlstring);

$row = mysql_fetch_assoc($result);

$lng = $row["longitude"] / 180 * M_PI;
$lat = $row["latitude"] / 180 * M_PI;

mysql_free_result($result);

$sqlstring2 = "SELECT DISTINCT
postcodelatlng.postcode,
(
6367.41 * SQRT(
2 * (
1- COS(RADIANS(postcodelatlng.latitude)) * COS(".$lat.") * (
SIN(RADIANS(postcodelatlng.longitude)) * SIN(".$lng.") + COS(RADIANS(postcodelatlng.longitude)) * COS(".$lng.")
) - SIN(RADIANS(postcodelatlng.latitude)) * SIN(".$lat.")
)
)
) AS Distance
FROM
postcodelatlng AS postcodelatlng
HAVING Distance <= '".$radius."'
ORDER BY Distance ";$result1 = mysql_query($sqlstring2) or die('query failed: ' . mysql_error());
while($row = mysql_fetch_array($result1)){
$searchlets = "SELECT * FROM property_details WHERE postcode = '".$row['postcode']."' ";
$getresult = mysql_query($searchlets);
while($row2 = mysql_fetch_array($getresult)) {

echo ' Output here if Just Postcode was used ';

echo '<hr/>';
}}

// This seraches if only city name was used
$searchlets2 = "SELECT * FROM property_details WHERE street = '".$postcode."' ";
$getresult2 = mysql_query($searchlets2);
while($row3 = mysql_fetch_array($getresult2)) {
echo ' Output Here If just city name was searched ';

echo '<hr/>';
}

mysql_close($con);

?>

1

Решение

Вы можете попробовать ограничивающий прямоугольник, чтобы отфильтровать результаты. Тогда вы могли бы использовать формулу harvesine для лучшей точности. Или вы можете попробовать quadkey, a.k.a, заполняющий пробел, как. По сути, это пространственный индекс, который уменьшает размерность. Это алгоритм LSH. Прочитайте мой ответ на этот вопрос:Гео-поиск (расстояние) в PHP / MySQL (производительность)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]