0

緯度、経度、日付、時刻、engine_state列を持つ MySQL データベース テーブルがあります。

2 つの日付の間に車両が移動した距離を計算したいと考えています。クエリを作成して計算する方法が説明されているスレッドを見つけましたが、エンジンの状態に基づいて計算を行う必要があるため、私のケースはもう少し複雑です。

簡単な方法は、すべてのデータを照会して Java で実行することですが、すべてのデータを取得するのに約 20 秒かかり、私のニーズには非常に時間がかかります。

難しい方法は、データベースに対してクエリを実行し、それを計算して結果だけを返すように指示することです。

だからここに私が持っているデータの例があります:

          Latitude    Longtitude   Date      Time    Engine 
   row 1: 23.3232     42.43344     130510    120030  1
   row 2: 23.3233     42.43354     130510    120031  1
   row 3: 23.3243     42.43321     130510    120032  1
   row 4: 23.3243     42.43321     130510    120033  0
   row 5: 23.3243     42.43321     130510    120034  0
   row 6: 23.3243     42.43321     130510    120035  1
   row 7: 23.3254     42.43332     130510    120036  1

   and so on....

「エンジン」列は1 - エンジンが作動しているか、0 - エンジンが作動していない可能性があります

だから私は、エンジンの状態 = 0 の座標を除いて、 2 つの日付間の距離を計算したいと考えています。したがって、この場合、行 1 と行 4 の間の距離と、行 5 と行 7 の間の距離を合計する必要があります。

また、テーブルのデータがソートされていない場合があるため、クエリは最初にデータベースに日付と時刻で並べ替えるように指示する必要があることにも注意してください。

MySQL を使用してそのようなクエリを作成する方法を知っている人はいますか?

PS私が使用したい距離を計算するための式はHaversineです(Vincetyではありません)

4

2 に答える 2

1

Haversine 距離を計算する関数があると仮定すると、次のようなことができます。

SELECT SUM(func_Haversine(Loc1.Latitude, Loc1.Longtitude, Loc2.Latitude, Loc2.Longtitude))
FROM
(
    SELECT Latitude, Longtitude, @Cnt1:=@Cnt1+1 AS SeqCnt
    FROM 
    (
        SELECT Latitude, Longtitude
        FROM SomeTable
        WHERE `Date` BETWEEN '13-05-10' AND '13-05-10'
        AND Engine = 1
        ORDER BY `Date`, `Time`
    ) Sub0
    CROSS JOIN (SELECT @Cnt1:=0) Sub1
) Loc1
INNER JOIN
(
    SELECT Latitude, Longtitude, @Cnt2:=@Cnt2+1 AS SeqCnt
    FROM 
    (
        SELECT Latitude, Longtitude
        FROM SomeTable
        WHERE `Date` BETWEEN '13-05-10' AND '13-05-10'
        AND Engine = 1
        ORDER BY `Date`, `Time`
    ) Sub0
    CROSS JOIN (SELECT @Cnt2:=1) Sub1
) Loc2
ON Loc1.SeqCnt = Loc2.SeqCnt

これは、関連するすべてのレコードを取得し、シーケンス番号を追加して、各レコードとその後続のレコードを 1 行で取得します。次に、各ポイント間の距離を取得し、距離を合計します

クエリで Haversine 式を直接使用することもできますが、基本的な SQL のアイデアを提供するだけでは、読むのがかなり面倒で不必要です。

日付列と時間列が含まれていますが、説明では、関心のある日付範囲のみであり、時間はレコードの順序付けに使用されるだけであると想定しています

私はノックアップして、クエリの基本について SQLfiddle を作成しました (行を元に戻しますが、harsine 距離を計算しません)。

http://sqlfiddle.com/#!2/1f014a/10

于 2013-10-10T15:37:39.910 に答える