PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostGIS:z- und m-Dimensionen abfragen (linestringzm)

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: