PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostGIS:Zapytanie o wymiary z i m (linestringzm)

Jeśli chcesz sprawdzić każdy punkt swojego LineStringu, możesz ST_DumpPoints je i zdobądź M wymiar z ST_M . Następnie wyodrębnij podzbiór jako ciąg linii zawierający nakładający się M wartości i zastosuj ST_MakeLine z 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<>skrzypce

Uwaga :W zależności od rozmiarów tabeli i LineString to zapytanie może stać się dość powolne, ponieważ wartości są analizowane w czasie zapytania i dlatego nie są indeksowane. Imho bardziej elegancką alternatywą byłoby ..

.. 1) aby utworzyć tstzrange kolumna

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) poprawnie zindeksować

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. i 3) aby wypełnić go czasem geom pierwszy i ostatni punkty:

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

Następnie możesz przyspieszyć działanie, sprawdzając, czy indeksowana kolumna pokrywa się z podanym interwałem. To znacznie skróci czas zapytania:

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

Demo:db<>skrzypce

Dalsza lektura:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powolne porządkowanie zapytań według kolumny w połączonej tabeli

  2. Wyświetlaj tabele w schemacie PostgreSQL

  3. postgres:pobierz n pierwszych wystąpień wartości w każdej grupie

  4. Wyjście zapytania PostgreSQL w postaci pliku Excel

  5. Czy istnieje odpowiednik Postgresql KAŻDEJ funkcji agregującej w innych RDBMS?