Pokud chcete zkontrolovat každý jednotlivý bod svého LineString, můžete ST_DumpPoints
a získejte M
rozměr s ST_M
. Poté extrahujte podmnožinu jako LineString obsahující překrývající se M
hodnoty a použijte ST_MakeLine
s 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;
Ukázka:db<>fiddle
Poznámka :V závislosti na vaší tabulce a velikosti LineString může být tento dotaz docela pomalý, protože hodnoty jsou analyzovány v době dotazu, a proto nejsou indexovány. Imho elegantnější alternativa by byla ..
.. 1) vytvořit tstzrange
sloupec
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) pro správné indexování
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. a 3) vyplňte jej časem geom
první a poslední body:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Poté můžete věci urychlit kontrolou, zda se indexovaný sloupec překrývá s daným intervalem. To výrazně zkrátí dobu dotazování:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Ukázka:db<>fiddle
Další čtení: