Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 求两个经度格子之间的距离_Mysql_Sql_Geolocation - Fatal编程技术网

Mysql 求两个经度格子之间的距离

Mysql 求两个经度格子之间的距离,mysql,sql,geolocation,Mysql,Sql,Geolocation,我有一个要求,我想找出两点之间的差异。使用经度和格度。每2分钟我从一个设备获取数据包并插入数据库。所以我想找出一个设备的两个连续数据包之间的距离。表包含以下列 1.id 2.device_d 3.longitude 4.lattitude 我知道使用查询可以通过查询找到两个地理位置之间的距离 SELECT id, ( 3959 * acos ( cos ( radians(78.3232) ) * cos( radians( lat ) ) * cos(

我有一个要求,我想找出两点之间的差异。使用经度和格度。每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

我怎样才能利用上面的公式来查找partciular设备的两个连续行之间的距离(使用设备id)我怎样才能使用mysql查询来做到这一点呢?

有人能帮忙吗?

好的,更多值得思考的东西

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 |
+-----+------+

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

类似这样的结果。按顺序生成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

这些点在我们的星球上吗?使用您当前的select两次,生成一个序列号并加入2,以便一行与下一行连接。我的疑问是如何获取一辆车的两个连续行的值。您必须创建一个存储过程,在该过程中,您必须逐个通过lat和long。这不能在单个查询中完成。我的疑问是如何获得一辆车的两个连续行的值。如果我得到,我可以继续确定。我将测试它…我对Sub1.seq=Sub2.seq还有距离是以公里为单位的??两个子选择有不同的开始顺序,因此在一个子选择中,第一项是1,另一项是2。因此,当序列号匹配时,您有一条记录,并且记录在它之后。我刚刚从上面@SamarHaider的回复中得到了距离计算,但是一旦你有了这两个位置,就很容易改变到你想要的计算。
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