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

时间:2014-05-13 17:26:30

标签: php mysql gps coordinates

我在mysql数据库GPS_tbl中有表my_db。在GPS_tbl中有五列1)uid 2)latitude 3)longitude 4)regid 5)status。在列5)status中,有两种类型的值存储为varchar,其中一种是free,另一种是move。我现在正在做的是当用户使用latitudelongitudePOST()发送他/她的gps坐标时,从列2)latitude 3)longitude i中选择最短坐标我正在使用毕达哥拉斯定理,因此我使用此比较这些用户发送的坐标与列2)latitude 3)longitude中已存储的坐标,并选择4)regid。现在我想要的只是4)regid选择2)latitude 3)longitude 5)status值为free的{​​{1}}的最短坐标。

目前我正在使用此查询,该查询仅针对4)regid选择shortest coordinate而不关注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      |
|              |            |             |             |             |
+--- ----------+------------+-------------+-------------+-------------+

1 个答案:

答案 0 :(得分:1)

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

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. 如果两点之间的距离很小,则该距离计算是足够的近似值,但是一旦进入较大的值,它将越来越远离真值。为什么?因为地球表面是球体的表面,而不是平面。要计算正确的值,请使用Google“Great Circle Distance”

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