sql >> Database >  >> RDS >> PostgreSQL

PostGIS:Vraag z- en m-dimensies (linestringzm)

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:




  1. Hoe te repareren "Server is niet geconfigureerd voor GEGEVENSTOEGANG" in SQL Server

  2. 4 manieren om te controleren op dubbele rijen in SQL Server

  3. MariaDB UNION-operator uitgelegd

  4. Is er een manier om een ​​aangepast type van C# door te geven aan Oracle met behulp van System.Data.OracleClient?