sql >> Database teknologi >  >> RDS >> PostgreSQL

PostGIS:Forespørgsel z og m dimensioner (linestringzm)

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:




  1. SELECT INTO Variabel i MySQL DECLARE forårsager syntaksfejl?

  2. MySQL-krypterede kolonner

  3. PHP PDO multiple select-forespørgsel, der konsekvent dropper sidste rækkesæt

  4. Oprettelse af XML i PHP ved hjælp af SimpleXML med specialtegn