sql >> Databáze >  >> RDS >> PostgreSQL

PostGIS:Dotaz na rozměry z a m (linestringzm)

Pokud chcete zkontrolovat každý jednotlivý bod svého LineString, můžete ST_DumpPoints a získejte M rozměr s ST_M . Poté extrahujte podmnožinu jako LineString obsahující překrývající se M hodnoty a použijte ST_MakeLine s 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;

Ukázka:db<>fiddle

Poznámka :V závislosti na vaší tabulce a velikosti LineString může být tento dotaz docela pomalý, protože hodnoty jsou analyzovány v době dotazu, a proto nejsou indexovány. Imho elegantnější alternativa by byla ..

.. 1) vytvořit tstzrange sloupec

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) pro správné indexování

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. a 3) vyplňte jej časem geom první a poslední body:

UPDATE t SET line_interval = 
  tstzrange(
    to_timestamp(ST_M(ST_PointN(geom,1))),
    to_timestamp(ST_M(ST_PointN(geom,ST_NPoints(geom)))));

Poté můžete věci urychlit kontrolou, zda se indexovaný sloupec překrývá s daným intervalem. To výrazně zkrátí dobu dotazování:

SELECT * FROM t
WHERE line_interval && tstzrange(
                        to_timestamp(1618138148), 
                        to_timestamp(1618388700));

Ukázka:db<>fiddle

Další čtení:




  1. Kde mohu získat SQL pro výchozí schéma HR společnosti Oracle?

  2. vyhledávání produktů, které si zákazníci koupili společně

  3. Zálohovat tabulku se sloupcem GEOMETRY pomocí mysqldump?

  4. Jak mohu použít spouštěče PostgreSQL k ukládání změn (příkazy SQL a změny řádků)