Als u elk afzonderlijk punt van uw LineString wilt controleren, kunt u ST_DumpPoints
ze en ontvang de M
dimensie met ST_M
. Pak daarna de subset uit als een LineString met de overlappende M
waarden en pas ST_MakeLine
. toe met een 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<>fiddle
Opmerking :Afhankelijk van de grootte van uw tabel en LineString kan deze query behoorlijk traag worden, omdat waarden worden geparseerd in de querytijd en daarom niet worden geïndexeerd. Imho zou een eleganter alternatief zijn ..
.. 1) om een tstzrange
te maken kolom
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) om het correct te indexeren
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. en 3) om het te vullen met de tijd van geom
's eerste en laatste punten:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Daarna kunt u de zaken versnellen door te controleren of de geïndexeerde kolom overlapt met een bepaald interval. Dit zal de zoektijd aanzienlijk verbeteren:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo:db<>fiddle
Verder lezen: