Wenn Sie jeden einzelnen Punkt Ihres LineStrings überprüfen möchten, können Sie ST_DumpPoints
verwenden sie und erhalte das M
Dimension mit ST_M
. Extrahieren Sie danach die Teilmenge als LineString mit dem überlappenden M
Werte und wenden Sie ST_MakeLine
an mit einem 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<>fiddle
Hinweis :Abhängig von Ihrer Tabellen- und LineString-Größe kann diese Abfrage ziemlich langsam werden, da Werte in der Abfragezeit analysiert und daher nicht indiziert werden. Eine imho elegantere Alternative wäre ..
.. 1) um einen tstzrange
zu erstellen Spalte
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) um es richtig zu indizieren
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. und 3) um es mit der Zeit von geom
zu füllen ist zuerst und zuletzt Punkte:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Danach können Sie die Dinge beschleunigen, indem Sie prüfen, ob sich die indizierte Spalte mit einem bestimmten Intervall überschneidet. Dadurch wird die Abfragezeit erheblich verbessert:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo:db<>fiddle
Weiterführende Literatur: