【问题标题】:Radius Search using postcode [closed]使用邮政编码进行半径搜索 [关闭]
【发布时间】:2014-01-21 05:44:20
【问题描述】:

我正在使用以下查询进行半径搜索。

$sqlstring2 = "SELECT DISTINCT 
  geodb.postcode,
  (
    6367.41 * SQRT(
      2 * (
        1- COS(RADIANS(geodb.latitude)) * COS(".$lat.") * (
          SIN(RADIANS(geodb.longitude)) * SIN(".$lng.") + COS(RADIANS(geodb.longitude)) * COS(".$lng.")
        ) - SIN(RADIANS(geodb.latitude)) * SIN(".$lat.")
      )
    )
  ) AS Distance 
FROM
  geodb AS geodb 
WHERE (
    6367.41 * SQRT(
      2 * (
        1- COS(RADIANS(geodb.latitude)) * COS(".$lat.") * (
          SIN(RADIANS(geodb.longitude)) * SIN(".$lng.") + COS(RADIANS(geodb.longitude)) * COS(".$lng.")
        ) - SIN(RADIANS(geodb.latitude)) * SIN(".$lat.")
      )
    ) <= '".$radius."'
  ) 
ORDER BY Distance ";

这个查询有什么问题吗?有人可以在这方面帮助我吗?

谢谢

更新

我正在使用下面的代码

<?php
$postcode = 'E1 0AA';
$radius = 1;

$conn = mysql_connect('127.0.0.1','root','') or die('db connect error:'.mysql_error());
mysql_select_db('database', $conn) or die('could not select database');

$sqlstring = "SELECT * FROM geodb WHERE postcode ='".$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 geodb.postcode, (6367.41*SQRT(2*(1-cos(RADIANS(geodb.latitude))*cos(".$lat.")*(sin(RADIANS(geodb.longitude))*sin(".$lng.")+cos(RADIANS(geodb.longitude))*cos(".$lng."))-sin(RADIANS(geodb.latitude))* sin(".$lat.")))) AS Distance FROM geodb AS geodb WHERE (6367.41*SQRT(2*(1-cos(RADIANS(geodb.latitude))*cos(".$lat.")*(sin(RADIANS(geodb.longitude))*sin(".$lng.")+cos(RADIANS(geodb.longitude))*cos(".$lng."))-sin(RADIANS(geodb.latitude))*sin(".$lat."))) <= '".$radius."') ORDER BY Distance";

$result1 = mysql_query($sqlstring2) or die('query failed: ' . mysql_error());

echo  mysql_num_rows($result1);

die();

这段代码给了我结果

1215

但是如果我搜索

http://www.freemaptools.com/find-uk-postcodes-inside-radius.htm

邮政编码 E1 0AA 和 1 英里半径 我得到结果 4 (E1,E1W,E77,E98)。

谁能说说问题出在哪里??

谢谢

【问题讨论】:

  • 您收到错误的结果了吗?
  • 你的意思是除了计算很耗时并且对 geodb 表中的每条记录运行 两次
  • @RoyalBg - 是的,我收到了错误的结果。
  • ...而且您(可能)对 SQL 注入持开放态度 - 使用准备好的语句。
  • @crush- “定义错误...”是什么意思?

标签: php sql


【解决方案1】:

每条记录只计算一次,减少工作量

$sqlstring2 = "SELECT DISTINCT 
  geodb.postcode,
  (
    6367.41 * SQRT(
      2 * (
        1- COS(RADIANS(geodb.latitude)) * COS(".$lat.") * (
          SIN(RADIANS(geodb.longitude)) * SIN(".$lng.") + COS(RADIANS(geodb.longitude)) * COS(".$lng.")
        ) - SIN(RADIANS(geodb.latitude)) * SIN(".$lat.")
      )
    )
  ) AS Distance 
FROM
  geodb AS geodb 
HAVING Distance <= '".$radius."'
ORDER BY Distance ";

通过在 PHP 中计算 bounding box 并将其作为 SQL 查询中的 WHERE 子句应用来进一步减少它

【讨论】:

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