查找两个经度纬度之间的距离-Mysql

Posted

技术标签:

【中文标题】查找两个经度纬度之间的距离-Mysql【英文标题】:Find Distance bewteen two Longitude Lattitude-Mysql 【发布时间】:2013-10-23 09:53:20 【问题描述】:

我有一个要求,我想找到两点之间的差异。使用经度和纬度。每 2 分钟我从设备获取数据包并插入数据库。所以我想找到一个设备的两个连续数据包之间的距离。表格包含以下列

 1.id
 2.device_d
 3.longitude
 4.lattitude

我知道使用查询可以使用查询找到两个地理位置之间的距离。

    SELECT
id, (
  3959 * acos (
    cos ( radians(78.3232) )
   * cos( radians( lat ) )
  * cos( radians( lng ) - radians(65.3234) )
  + sin ( radians(65.3234) )
  * sin( radians( lat ) )
)
) AS distance
FROM markers

我如何使用上述公式来查找 特定设备的两个连续行之间的距离(使用设备 ID) 我如何使用 mysql 查询来做到这一点 .谁能帮忙?

【问题讨论】:

这些点在我们的星球上吗? 使用您当前的选择两次,生成一个序列号并加入 2 以便一行与下一行连接。 【参考方案1】:
SELECT id,
 ACOS(SIN( lat_1 * PI) * SIN(lat_2 * PI) + COS( lat_1 * PI) * COS(lat_2 * PI) * COS(( lon_1 - lon_2 ) * PI)) / PI * 60 * 1.1515 AS distance
FROM markers

它会给出以英里为单位的结果。

【讨论】:

我的疑惑是如何获取一辆车连续两行的值 你必须创建一个存储过程,你必须在其中一个一个地传递lat和long。这不能在单个查询中完成。【参考方案2】:

好吧,更多值得深思...

SELECT * FROM bin;
+-----+
| i   |
+-----+
|   1 |
|   2 |
|   4 |
|   8 |
|  16 |
|  32 |
|  64 |
| 128 |
+-----+

SELECT x.i
     , MIN(y.i) next 
  FROM bin x 
  LEFT 
  JOIN bin y 
    ON y.i > x.i 
 GROUP 
    BY x.i;

+-----+------+
| i   | next |
+-----+------+
|   1 |    2 |
|   2 |    4 |
|   4 |    8 |
|   8 |   16 |
|  16 |   32 |
|  32 |   64 |
|  64 |  128 |
| 128 | NULL |
+-----+------+

【讨论】:

我的疑问是如何获取一辆车的两个连续行的值。如果我得到了,我可以继续【参考方案3】:

类似的东西。按顺序生成2个位置列表并添加序列号,并根据车辆id和序列号连续加入。然后进行计算。

SELECT Sub1.id, Sub1.vehicle_id, ACOS(SIN( Sub1.lat * PI) * SIN(Sub2.lat * PI) + COS( Sub1.lat * PI) * COS(Sub2.lat * PI) * COS(( Sub1.lon - Sub2.lon ) * PI)) / PI * 60 * 1.1515 AS distance
FROM
(
    SELECT id, vehicle_id, longitude, lattitude, @seq:=IF(@prev_vehicle_id=vehicle_id, 1, @seq) + 1 AS seq, @prev_vehicle_id := vehicle_id
    FROM 
    (
        SELECT id, vehicle_id, longitude, lattitude
        FROM markers
        ORDER BY vehicle_id, id
    ) Sub3
    CROSS JOIN (SELECT @seq:=1, @prev_vehicle_id:=0
) Sub1
INNER JOIN
(
    SELECT id, vehicle_id, longitude, lattitude, @seq1:=IF(@prev_vehicle_id1=vehicle_id, 0, @seq1) + 1 AS seq, @prev_vehicle_id1 := vehicle_id
    FROM 
    (
        SELECT id, vehicle_id, longitude, lattitude
        FROM markers
        ORDER BY vehicle_id, id
    ) Sub4
    CROSS JOIN (SELECT @seq1:=0, @prev_vehicle_id1:=0
) Sub2
ON Sub1.vehicle_id = Sub2.vehicle_id
AND Sub1.seq = Sub2.seq

【讨论】:

好的..我会测试它...我对 Sub1.seq = Sub2.seq 也有疑问,距离也以公里为单位?? 这两个子选择有不同的起始序列,因此第一个项目是 1,另一个是 2。因此,当序列号匹配时,你有一个记录和它之后的记录。我刚刚从上面@SamarHaider 的回复中获得了距离计算,但是一旦你有了 2 个位置,就很容易改变你想要的任何计算。

以上是关于查找两个经度纬度之间的距离-Mysql的主要内容,如果未能解决你的问题,请参考以下文章

用于查找使用纬度和经度之间的距离的Sql返回错误的距离

两个纬度/经度表之间的距离计算

在 SQL Server 中使用纬度和经度查找两点之间的距离

计算两个纬度/经度点之间的距离不一致

PHP 计算两个坐标之间的距离(纬度,经度)

计算两个纬度和经度坐标之间的距离