PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostGIS:Kueri dimensi z dan m (linestringzm)

Jika Anda ingin memeriksa setiap titik LineString Anda, Anda dapat ST_DumpPoints mereka dan dapatkan M dimensi dengan ST_M . Setelah itu ekstrak subset sebagai LineString yang berisi M . yang tumpang tindih nilai dan terapkan ST_MakeLine dengan 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<>biola

Catatan :Bergantung pada tabel Anda dan ukuran LineString, kueri ini mungkin menjadi sangat lambat, karena nilai sedang diuraikan dalam waktu kueri dan oleh karena itu tidak diindeks. Imho alternatif yang lebih elegan adalah ..

.. 1) untuk membuat tstzrange kolom

ALTER TABLE t ADD COLUMN line_interval tstzrange;

.. 2) untuk mengindeksnya dengan benar

CREATE INDEX idx_t_line_interval ON t USING gist (line_interval);

.. dan 3) untuk mengisinya dengan waktu geom pertama dan terakhir poin:

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

Setelah itu Anda dapat mempercepat dengan memeriksa apakah kolom yang diindeks tumpang tindih dengan interval yang diberikan. Ini akan meningkatkan waktu kueri secara signifikan:

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

Demo:db<>biola

Bacaan lebih lanjut:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails + Postgres drop error:database sedang diakses oleh pengguna lain

  2. Bagaimana menghubungkan (Py)Spark ke database Postgres menggunakan JDBC

  3. Apakah PK referensi Kunci Asing memerlukan batasan NOT NULL?

  4. Isi tabel dengan data untuk tanggal yang hilang (postgresql, redshift)

  5. Bagaimana cara terhubung dari docker-compose ke Host PostgreSQL?