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 :