sql >> Base de Datos >  >> RDS >> PostgreSQL

PostGIS:consulta las dimensiones z y m (linestringzm)

Si desea verificar cada punto de su LineString, puede ST_DumpPoints ellos y obtener la M dimensión con ST_M . Después de eso, extraiga el subconjunto como LineString que contiene la superposición M valores y aplicar ST_MakeLine con un 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;

Demostración:db<>fiddle

Nota :Según su tabla y los tamaños de LineString, esta consulta puede volverse bastante lenta, ya que los valores se analizan en el momento de la consulta y, por lo tanto, no se indexan. En mi humilde opinión, una alternativa más elegante sería ..

.. 1) para crear un tstzrange columna

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) para indexarlo correctamente

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. y 3) para llenarlo con la hora de geom de primero y último puntos:

UPDATE t SET line_interval = 
  tstzrange(
    to_timestamp(ST_M(ST_PointN(geom,1))),
    to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));

Después de eso, puede acelerar las cosas comprobando si la columna indexada se superpone con un intervalo determinado. Esto mejorará significativamente el tiempo de consulta:

SELECT * FROM t
WHERE line_interval && tstzrange(
                        to_timestamp(1618138148), 
                        to_timestamp(1618388700));

Demostración:db<>fiddle

Lectura adicional: