Jika Anda ingin memeriksa setiap titik LineString Anda, Anda dapat ST_DumpPoints
mereka dan dapatkan M
dimensi dengan ST_M
. Setelah itu ekstrak subset sebagai LineString yang berisi M
. yang tumpang tindih nilai dan terapkan ST_MakeLine
dengan 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;
Demo:db<>biola
Catatan :Bergantung pada tabel Anda dan ukuran LineString, kueri ini mungkin menjadi sangat lambat, karena nilai sedang diuraikan dalam waktu kueri dan oleh karena itu tidak diindeks. Imho alternatif yang lebih elegan adalah ..
.. 1) untuk membuat tstzrange
kolom
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) untuk mengindeksnya dengan benar
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. dan 3) untuk mengisinya dengan waktu geom
pertama dan terakhir poin:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Setelah itu Anda dapat mempercepat dengan memeriksa apakah kolom yang diindeks tumpang tindih dengan interval yang diberikan. Ini akan meningkatkan waktu kueri secara signifikan:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo:db<>biola
Bacaan lebih lanjut: