我在 mysql 数据库 my_db
中有表 GPS_tbl
。在 GPS_tbl
中有五列 1)uid 2)latitude 3)longitude 4)regid 5)status
。在 5)status
列中,有两种类型的值存储为 varchar,一种是 free
,另一种是 move
。我现在正在做的是,当用户通过 POST()
以 latitude
和 longitude
形式发送他/她的 GPS 坐标时,因此选择列2)纬度3)经度
中的最短坐标我正在使用毕达哥拉斯定理,因此通过使用它,我将这些用户发送的坐标与列2中已存储的坐标进行比较)latitude 3)longitude
并选择 4)regid
。现在我想要的只是选择 4)regid
与 2)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) 不要使用
mysql_
函数:它们已被弃用; 2) 您的代码容易受到 SQL 注入(inject)攻击。
关于php - 如何根据给定条件选择最短的GPS坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637891/