【问题标题】:Postcode Radius Search邮政编码半径搜索
【发布时间】:2016-09-29 23:56:33
【问题描述】:

好的,所以我被要求创建一个邮政编码搜索脚本。我对更高级的 php/mysql 还是很陌生。我需要的只是帮助简化这个脚本。 Postcode 数据库是整个英国邮政编码 sql 数据库 1.3m 行。因此,当我使用脚本获取半径内的所有邮政编码时,需要很长时间。有没有办法简化它。甚至可能使用 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); 

?>

【问题讨论】:

  • Java/Ajax?!?确定你不是指javascript?这并不一定天生更快,所花费的时间是每一行上昂贵的haversine公式
  • 预先计算所有邮政编码的纬度/经度,并将其存储在数据库中;索引数据库中的这些列;使用边界框进行搜索,减少执行昂贵的haversine计算所需的记录数
  • @MarkBaker - 在英国邮政编码占据不规则形状。
  • @EdHeal - 相信我,我非常了解英国邮政编码的工作原理,以及它们与地理空间索引的关系。我也知道操作系统在他们的邮政编码数据库中为邮政编码提供了一个单一的中心点纬度/经度,所以精确的形状不太重要
  • 如果您使用的是 MySQL 5.7,您可能希望使用新的空间函数来查找点(在地球半径的球体上):dev.mysql.com/doc/refman/5.7/en/…

标签: php mysql postal-code


【解决方案1】:

您可以尝试使用边界框来过滤掉结果。然后,您可以使用 Harvesine 公式获得更好的准确性。或者你可以试试四键,也就是空间填充曲线之类的。基本上它是一个空间索引并减少了维度。这是一个LSH算法。阅读我对这个问题的回答:Geo-Search (Distance) in PHP/MySQL (Performance)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多