Se você quiser verificar todos os pontos de sua LineString, você pode
ST_DumpPoints
e obtenha o M
dimensão com ST_M
. Depois disso, extraia o subconjunto como um LineString contendo o M
sobreposto valores e aplique ST_MakeLine
com um 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;
Demonstração:db<>fiddle
Observação :Dependendo dos tamanhos de sua tabela e LineString, essa consulta pode se tornar bastante lenta, pois os valores estão sendo analisados no tempo da consulta e, portanto, não são indexados. Imho uma alternativa mais elegante seria ..
.. 1) para criar um
tstzrange
coluna ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) para indexá-lo corretamente
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. e 3) para preenchê-lo com a hora de
geom
de primeiro e último pontos:UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Depois disso, você pode acelerar as coisas verificando se a coluna indexada se sobrepõe a um determinado intervalo. Isso melhorará significativamente o tempo de consulta:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demonstração:db<>fiddle
Leitura adicional: