-1

2 つのポイントの差を見つけたいという要件があります。経度と緯度を使用します。2 分ごとにデバイスからパケットを取得し、データベースに挿入しています。だから私は、デバイスの 2 つの連続したパケット間の距離を見つけたいです。テーブルには次の列が含まれています

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

クエリを使用して、クエリを使用して2つの地理位置情報の距離を見つけることができることを知っています。

    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

特定のデバイスの2つの連続する行の間の距離を見つけるために上記の式をどのように利用できますか(デバイスIDを使用) mysqlクエリを使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

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
于 2013-10-25T09:12:01.213 に答える
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 |
+-----+------+
于 2013-10-23T11:49:06.110 に答える
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

結果はマイルになります。

于 2013-10-23T12:50:56.480 に答える