我有一个要求,我想找到两点之间的差异。使用经度和lattitude。每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
我如何使用上述公式来查找partincular设备的两个连续行之间的距离(使用设备ID)如何使用 mysql查询来执行此操作任何人都可以帮忙吗?
答案 0 :(得分:0)
好的,更多的思考......
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 |
+-----+------+
答案 1 :(得分:0)
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
它将以英里为单位给出结果。
答案 2 :(得分:0)
像这样的东西。按顺序生成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