Hvis du vil tjekke hvert enkelt punkt i din LineString, kan du ST_DumpPoints
dem og få M
dimension med ST_M
. Udtræk derefter undersættet som en LineString, der indeholder den overlappende M
værdier og anvende ST_MakeLine
med en 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
Bemærk :Afhængigt af din tabel- og LineString-størrelser kan denne forespørgsel blive ret langsom, da værdier parses i forespørgselstiden og derfor ikke indekseres. Et mere elegant alternativ ville være ..
.. 1) for at oprette en tstzrange
kolonne
ALTER TABLE t ADD COLUMN line_interval tstzrange;
.. 2) for at indeksere det korrekt
CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);
.. og 3) for at udfylde den med tiden for geom
er første og sidste point:
UPDATE t SET line_interval =
tstzrange(
to_timestamp(ST_M(ST_PointN(geom,1))),
to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));
Derefter kan du fremskynde tingene ved at kontrollere, om den indekserede kolonne overlapper med et givet interval. Dette vil forbedre forespørgselstiden markant:
SELECT * FROM t
WHERE line_interval && tstzrange(
to_timestamp(1618138148),
to_timestamp(1618388700));
Demo:db<>fiddle
Yderligere læsning: