PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostGIS :Interroger les dimensions z et m (linestringzm)

Si vous voulez vérifier chaque point de votre LineString, vous pouvez ST_DumpPoints eux et obtenez le M cote avec ST_M . Après cela, extrayez le sous-ensemble en tant que LineString contenant le chevauchement M valeurs et appliquez ST_MakeLine avec 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;

Démo :db<>violon

Remarque :En fonction de la taille de votre table et de LineString, cette requête peut devenir assez lente, car les valeurs sont analysées au moment de la requête et ne sont donc pas indexées. À mon humble avis, une alternative plus élégante serait ..

.. 1) pour créer une tstzrange colonne

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) pour bien l'indexer

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. et 3) pour le remplir avec l'heure de geom est premier et dernier points :

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

Après cela, vous pouvez accélérer les choses en vérifiant si la colonne indexée chevauche un intervalle donné. Cela améliorera considérablement le temps de requête :

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

Démo :db<>violon

Lectures complémentaires :