PostGISを使用してポイントからラインを作成しますか?


10

多数の車両の位置データを含むPostGISテーブルがあり、これらのポイントからラインを作成したいと考えています。

データは車両IDで選択し、タイムスタンプで並べ替えることができますが、結果から行を作成する方法は?

基本的に必要なのは、ポイント1からポイント2までの1つのラインセグメントで、ラインをファイナライズしてから、ポイント2からポイント3までです。

後者は、ある地点から次の地点までの車両の走行方向と速度を計算するために必要です。


1
GROUP BY vehicle_idとORDER BYタイムスタンプが算出されると、ST_MakeLine()関数がこれを実行します。参照:postgis.refractions.net/docs/ST_MakeLine.html
Micha

わかりました、私は単にそれを試してみて、次のステートメントを発行しました:SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;それは私にすべての車両のトラックを与えるでしょう、そして私が正確に必要とするものではありません。ポイント1からポイント2へのラインを作成するようにST_MakeLine()に指示する方法、ラインをファイナライズし、ポイント2からポイント3へ新しいラインを開始する...?
トーマスベッカー2013年

「ポイント1」、「ポイント2」、「ポイント3」とは何ですか?それらをどのように認識しますか?
Micha 2013年

タイムスタンプの順序でそれらを認識しようと思った...- ORDER BY ais_data.bs_tsそれは可能ですか?したがって、ポイント1、ポイント2などは、基本的に、Selectステートメントの結果として各行に与えられるポイント情報です。
トーマスベッカー

あなたは、最初の段階で車両ごとに1行を生成した後、メーリングリストたPostGISからヒントを使用して、このラインから頂点を生成することができpostgis.17.x6.nabble.com/...を
ThomasG77

回答:


12

自己結合または相関サブクエリを使用していくつかの方法で実行できますが、ウィンドウ関数を使用するのがおそらく最も簡単な方法です。

この関数lead()は、指定されたパーティションで先にある値を返します。パーティションは(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

このクエリは、車両番号、パーティション内のそのポイントの位置(これで始まるラインの位置に等しい)、およびラインを作成する2つのジオメトリを提供します。もちろん、最後のポイントに対してNULL geom2を返すため、外部クエリでそれを確認する必要があります。

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.