PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostGIS:query z e m dimensioni (linestringzm)

Se vuoi controllare ogni singolo punto della tua LineString puoi ST_DumpPoints e ottieni il M dimensione con ST_M . Dopodiché estrai il sottoinsieme come LineString contenente il M sovrapposto valori e applica 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;

Demo:db<>violino

Nota :A seconda delle dimensioni della tabella e di LineString, questa query potrebbe diventare piuttosto lenta, poiché i valori vengono analizzati in fase di query e pertanto non vengono indicizzati. Imho un'alternativa più elegante sarebbe ..

.. 1) per creare un tstzrange colonna

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) per indicizzarlo correttamente

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. e 3) per popolarlo con l'ora di geom è il primo e ultimo punti:

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

Successivamente puoi accelerare le cose controllando se la colonna indicizzata si sovrappone a un determinato intervallo. Ciò migliorerà notevolmente il tempo di query:

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

Demo:db<>violino

Ulteriori letture: