アプリの 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
するテーブルです。MULTIPOINT
segment
次に、これら 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