Php 邮政编码半径搜索
好的,我被要求创建一个邮政编码搜索脚本。对于更高级的php/mysql,我还是个新手。我所需要的只是帮助简化这个脚本。邮政编码数据库是整个英国邮政编码sql数据库的130万行。因此,当我使用脚本获取半径内的所有邮政编码时,需要很长时间。有没有办法简化它。甚至可能使用Java/AjaxPhp 邮政编码半径搜索,php,mysql,postal-code,Php,Mysql,Postal Code,好的,我被要求创建一个邮政编码搜索脚本。对于更高级的php/mysql,我还是个新手。我所需要的只是帮助简化这个脚本。邮政编码数据库是整个英国邮政编码sql数据库的130万行。因此,当我使用脚本获取半径内的所有邮政编码时,需要很长时间。有没有办法简化它。甚至可能使用Java/Ajax <?php $postcode = str_replace( '+', '%20', $postcode ); $postcode = str_replace( '!"£$^&*()?<>
<?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);
?>
您可以尝试使用边界框过滤结果。然后你可以使用哈维辛公式来获得更好的准确度。或者你可以试试四键,也就是空间填充曲线。基本上,它是一个空间索引,减少了维度。这是一个LSH算法。阅读我在这个问题上的答案:Java/Ajax?!?你确定你不是说javascript?这并不一定是天生的更快,所花费的时间是每一行上昂贵的哈弗公式预先计算出所有邮政编码的纬度/经度,并将其存储在数据库中;为数据库中的这些列编制索引;使用边界框进行搜索,减少执行昂贵的haversine计算所需的记录数for@MarkBaker-在英国,邮政编码占据了一个不规则的形状。@EdHeal-相信我,我非常清楚英国邮政编码是如何工作的,以及它们与地理空间索引的关系。我还知道,操作系统在其邮政编码数据库中为邮政编码提供了一个单中心点lat/long,因此精确的形状没有那么重要。如果您使用MySQL 5.7,您可能希望使用新的空间函数查找点(在地球半径的球体上):