LineStringのすべてのポイントをチェックしたい場合は、ST_DumpPoints
それらを取得し、M
を取得します ST_M
のディメンション 。その後、重複するM
を含むLineStringとしてサブセットを抽出します。 値を適用し、ST_MakeLine
を適用します GROUP BY
を使用 :
WITH j AS (
SELECT id,geom,(ST_DumpPoints(geom)).geom AS p
FROM t
)
SELECT id,ST_AsText(ST_MakeLine(p))
FROM j
WHERE ST_M(p) BETWEEN 1618388000 AND 1618388700
GROUP BY id;
デモ: db <> fiddle
注 :テーブルとLineStringのサイズによっては、値がクエリ時間に解析され、インデックスが作成されないため、このクエリはかなり遅くなる可能性があります。私見よりエレガントな代替案は..
.. 1)tstzrange
を作成する 列
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2)適切にインデックスを作成する
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
..および3)geom
の時刻を入力します の最初 および最後 ポイント:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
その後、インデックス付きの列が特定の間隔でオーバーラップしているかどうかを確認することで、処理を高速化できます。これにより、クエリ時間が大幅に改善されます:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
デモ: db <> fiddle
さらに読む: