php - 如何根据给定条件选择最短的GPS坐标?

标签 php mysql gps coordinates

我在 mysql 数据库 my_db 中有表 GPS_tbl。在 GPS_tbl 中有五列 1)uid 2)latitude 3)longitude 4)regid 5)status。在 5)status 列中,有两种类型的值存储为 varchar,一种是 free,另一种是 move。我现在正在做的是,当用户通过 POST()latitudelongitude 形式发送他/她的 GPS 坐标时,因此选择列2)纬度3)经度中的最短坐标我正在使用毕达哥拉斯定理,因此通过使用它,我将这些用户发送的坐标与列2中已存储的坐标进行比较)latitude 3)longitude 并选择 4)regid 。现在我想要的只是选择 4)regid2)latitude 3)longitude 的最短坐标,其 5)status 值为 >免费

目前我正在使用此查询,它仅针对最短坐标选择4)regid,而不考虑status值:

$result = mysql_query("SELECT regid, sqrt(latitude-$lati)+sqrt(longitude-$longi) AS SQRT_DIST FROM GPS_tbl ORDER BY SQRT_DIST limit 1");

GPS_tbl

+--------------+------------+-------------+-------------+-------------+
|     uid      | latitude   | longitude   |   regid     |   status    |
+--------------+------------+-------------+-------------+-------------+
|      1       |  73.3433   |  18.5223    |APA91W-ClDoS |   move      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+
|      2       |  43.3433   |  24.5523    |BON91W-ClDoS |   free      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+
|      3       |  55.3433   |  37.5323    |WCD71P-ClDoS |   free      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+
|      4       |  65.3433   |  47.5323    |ZCF71D-ClDoS |   move      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+
|      5       |  85.3433   |  27.5323    |XVD73A-ClDoS |   free      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+

最佳答案

两点之间的毕达哥拉斯距离计算如下:

distance = sqrt( (x1-x0)^2 + (y1-y0)^2 )

这不是您的查询正在计算的内容:

SELECT regid, sqrt(latitude-$lati)+sqrt(longitude-$longi) AS SQRT_DIST FROM GPS_tbl ORDER BY SQRT_DIST limit 1

您得到的是两个值相加的平方根,而不是总和的平方根。试试这个:

SELECT regid, sqrt( (latitude-$lati)*(latitude-$lati) +(longitude-$longi)*(longitude-$longi) ) AS SQRT_DIST FROM GPS_tbl ORDER BY SQRT_DIST limit 1

现在,有几件事。

  1. 如果两点之间的距离很小时,此距离计算是一个足够的近似值,但一旦您输入较大的值,它就会与真实值越来越远。为什么?因为地球表面是球面,而不是平面。要计算正确的值,请搜索“大圆距离”

  2. 其他人可能会提到这一点,但这里是 1) 不要使用 mysql_ 函数:它们已被弃用; 2) 您的代码容易受到 SQL 注入(inject)攻击。

关于php - 如何根据给定条件选择最短的GPS坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637891/

相关文章:

Codeigniter 中的 Mysql "CREATE VIEW"

PHP MySQL 多标签搜索

mysql - SQL IF EXIST 问题

由 iBeacon 触发的 iOS 8 后台位置更新

php - 如何在 PHP 的 eclipse 内容辅助中禁用 "No Default Proposals"?

php - 错误代码 : 2013. 在查询 30.002 秒期间失去与 MySQL 服务器的连接

android - 如何计算与 map 中不同标记的距离,然后选择最少的一个

iphone - 如何在 iPhone 上可靠地获取位置

php - SQL 查询 2 行并且只显示一次具有相同的值

php - 如果不是子域,则更改为 www