Jeśli chcesz sprawdzić każdy punkt swojego LineStringu, możesz ST_DumpPoints
je i zdobądź M
wymiar z ST_M
. Następnie wyodrębnij podzbiór jako ciąg linii zawierający nakładający się M
wartości i zastosuj ST_MakeLine
z 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<>skrzypce
Uwaga :W zależności od rozmiarów tabeli i LineString to zapytanie może stać się dość powolne, ponieważ wartości są analizowane w czasie zapytania i dlatego nie są indeksowane. Imho bardziej elegancką alternatywą byłoby ..
.. 1) aby utworzyć tstzrange
kolumna
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) poprawnie zindeksować
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. i 3) aby wypełnić go czasem geom
pierwszy i ostatni punkty:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Następnie możesz przyspieszyć działanie, sprawdzając, czy indeksowana kolumna pokrywa się z podanym interwałem. To znacznie skróci czas zapytania:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo:db<>skrzypce
Dalsza lektura: