php - 如何从 MySql Query 提供的经纬度获取半径内的所有结果

标签 php mysql latitude-longitude

我的本​​地服务器上有一个 MySQL 表。该表包括用户标记的地点的纬度和经度。我正在尝试获取所有在提供的纬度和经度 1 公里范围内标记其位置的 ID。但是我的结果不是预期的。

表: map 位置

id  user_id lat     lng     place_name
1   1   28.584688   77.31593    Sec 2, Noida
2   2   28.596026   77.314494   Sec 7, Noida
3   5   28.579876   77.356131   Sec 35, Noida
4   1   28.516831   77.487405   Surajpur, Greater Noida
5   1   28.631451   77.216667   Connaught Place, New Delhi
6   2   19.098003   72.83407    Juhu Airport, Mumbai

这是 PHP 脚本

$lat = '28.596026';
$long = '77.314494';
$query = "SELECT  id,
                  (6371 * acos( cos( radians($lat) ) * cos( radians('lat') ) *
                        cos( radians('lng') - radians($long)) +
                        sin(radians($lat)) * sin(radians('lat')) )
                  ) as distance
    FROM  map_locations
    HAVING  'distance' < 1
    ORDER BY  id
    LIMIT  25";

$_res = mysqli_query($conn, $query) or die('Error query:  '.$query);
$detail = array();
$i=0;
while($row = $_res->fetch_assoc()) {
    $detail[$i] = $row['id'];
    $i++;
}
print_r($detail);

结果:

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
   [5] => 6
)

查询返回表中的所有记录。任何人都可以让我知道查询中有什么问题吗?

最佳答案

您的查询包含一些带引号的字符串,如“lat”、“long”和“distance”,其中应包含列名称,如 lat、long 和 distance。

特别是它以

结尾
 HAVING 'distance' < 0.5

这总是正确的,因为在数字上下文中使用字符串时,MySQL 总是将字符串强制转换为数字。它在 MySQL 中看起来像 HAVING 0 < 0.5 .你要

 HAVING distance < 0.5 

试试这个查询。 ( http://sqlfiddle.com/#!9/4f5116/5/2 )

SELECT id, 
       (6371 * acos( cos( radians($lat) ) * cos( radians(lat) ) * 
        cos( radians(lng) - radians($long)) + sin(radians($lat)) *
        sin(radians(lat)) )) as distance 
  FROM map_locations
HAVING distance < 0.5

还有,小心!当您在 map_locations 中获得数千行时table 这个查询会比堵车时的纽约公交车慢。您应该研究使用边界框来加快速度。 Read this .

关于php - 如何从 MySql Query 提供的经纬度获取半径内的所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45636746/

相关文章:

java - 我的应用程序使用相机不记录纬度和经度(文件元数据)

javascript - 错误 SyntaxError : JSON. 解析:JSON 数据后出现意外的非空白字符

php - 抛出异常以返回服务器错误是否不好,例如。 404页面不存在?

跨子域的 PHP session

php - 如何比较表单输入和数据库记录?

mysql - 插入后,在其他表触发器上删除

javascript - 使用 Google Autocomplete API 根据位置名称获取经纬度

php - 是否可以从本地主机转到外部地址

mysql - 从两个独立的表中选择数据

MySQL经纬度表设置