Ако искате да проверите всяка една точка от вашия LineString, можете да ST_DumpPoints
тях и вземете M
измерение с ST_M
. След това извлечете подмножеството като LineString, съдържащ припокриващия се M
стойности и приложете ST_MakeLine
с 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;
Демонстрация:db<>fiddle
Забележка :В зависимост от размерите на вашата таблица и LineString, тази заявка може да стане доста бавна, тъй като стойностите се анализират по време на заявка и следователно не се индексират. Мисля, че по-елегантна алтернатива би била ..
.. 1) за създаване на tstzrange
колона
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) правилно да го индексирате
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. и 3) да го попълните с времето на geom
първият на и последен точки:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
След това можете да ускорите нещата, като проверите дали индексираната колона се припокрива с даден интервал. Това значително ще подобри времето за заявка:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Демонстрация:db<>fiddle
Допълнителна информация: