6

アプリの PostGIS サーバーとしてCartoDBを使用しています。

のようなクエリを作成するには、トラックを保存し、トラック ポイントの座標ペアごとにタイムスタンプを関連付ける必要がありgive me the distance traveled between 12AM and 12PM on day Xます。

CartoDB では、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON の 3 種類のテーブルしか作成できません。トラックを挿入するには、MULTILINESTRING テーブルを使用しています。

私の最初の試みは、タイムスタンプを MULTILINESTRING の各ポイントの Z インデックスとして挿入することでしたが、常にERROR: Geometry has Z dimension but column does not.

これは「通常の」PostGISデータベースでどのように達成され、CartoDB PostGIS実装でどのように達成できますか?

更新 1:

jatorre answer の後、練習問題としてJSFiddleの例を作成しました。しかし、私は一貫性のない結果を得ています。

上記の例では、同じ 2 つのデータセットを持つ 2 つのテーブルがあります。ただし、1 つはMULTILINESTRING各行が a を表すテーブルで、もう 1 つは各座標セットを格納segmentするテーブルです。MULTIPOINTsegment

次に、これら 2 つのテーブルにクエリを実行してtotal distance of segments according to transport mode. じゃっとれの考えはかなり明確に理解できたと思いますが、なぜ合計距離Carと異なる結果が得られるのかわかりません。Walkヒントはありますか?

解決:

距離のわずかな違いは、pointsテーブルをグループ化する前にテーブルをソートする必要があったためsegmentです。これは、輸送モードに応じて移動した合計距離と時間を取得するための現在のクエリです。

WITH segments AS 
  (SELECT ST_Makeline(pts.the_geom_webmercator) as the_geom, (MAX(pts.timestamp) - MIN(pts.timestamp)) AS time, paths.transport_mode, paths.cartodb_id AS id
   FROM (SELECT * FROM points ORDER BY track_id, path_id, timestamp ASC) AS pts JOIN paths ON pts.path_id=paths.cartodb_id
   WHERE paths.user_id=1
   GROUP BY id, transport_mode)
SELECT SUM(ST_Length(segments.the_geom)) AS distance, SUM(segments.time), segments.transport_mode
FROM segments
GROUP BY segments.transport_mode
ORDER BY distance
4

1 に答える 1

3

まあ、それは少し依存します。

GPS トレースの構造があるとします。この場合、これらの GPS トレースを 2 つの座標だけの線であるセグメントに変換し、start_time と end_time で区切られた列を持つことができます。

次に、その構造を使用して、これらの日付の間に WHERE 句を使用して SELECT を実行し、セグメントの ST_Length_Spheroid を合計できます。

次のようなテーブルがあることを考慮して、すべてを 1 つのクエリで実行したい場合:

the_geom(point), timestamp, cartodb_id

あなたは次のようなことができます

WITH segments AS 
(SELECT ST_MakeLine(
   the_geom,
   (SELECT the_geom FROM tracks as st WHERE st.cartodb_id = t.cartodb_id+1)
) as the_geom
FROM traces as t WHERE timestamp BETWEEN ...)
SELECT sum(ST_Length_Spheroid(segments.the_geom)

これは完全に私たちの頭の中にあります... しかし、あなたがその考えを理解してくれることを願っています.

Z 次元を使用する必要はありません。実際、私たちはそれを十分にサポートしていません。

于 2012-06-28T22:49:31.283 に答える