Kotak batas untuk tabel PostGIS


19

Apakah ada cara mudah untuk mendapatkan kotak pembatas untuk seluruh tabel di PostGIS?

Jawaban:


26

ST_Extent harus melakukan trik.

ST_Extent - fungsi agregat yang mengembalikan kotak pembatas yang membatasi deretan geometri.

Diterapkan seperti ini:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;

13

Ketika @underdark menjawab , ST_Extent akan melakukan pekerjaan, tetapi perlu diingat bahwa itu tidak mengembalikan geometri tetapi a box2d. Jika Anda membutuhkan tipe geometri, Anda harus menggunakan sesuatu seperti

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

Juga, jika yang Anda butuhkan adalah mendapatkan kotak pembatas dari setiap baris yang dapat Anda gunakan ST_Extentdan yang palsu GROUP BY seperti ini:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

Dengan asumsi bahwa gid adalah kunci utama dari tabel

Tetapi ST_Envelope akan melakukan pekerjaan yang lebih baik seperti yang dinyatakan oleh @ bugmenot123 dalam komentar

SELECT ST_Envelope(geom) FROM your_table ;

1
Jika Anda membutuhkan kotak pembatas untuk setiap baris tanpa agregasi, cukup gunakan ST_Envelope! Tapi bukan itu yang diminta.
bugmenot123

1
Anda benar tentang st_envelope saya memperbarui jawabannya. Tentang "tidak diminta", kadang-kadang mencoba memberikan jawaban terkait karena bagi orang yang tidak berbahasa Inggris dengan baik (seperti saya) sulit untuk memilih teks pencarian yang benar untuk menemukan jawaban. Mungkin saya jatuh dalam pertanyaan ini mencari jawaban untuk topik kedua.
Francisco Puga

4

Kemungkinan lain adalah menggunakan ST_Envelopefungsi, yang mengembalikan geometri dengan SRID,

ST_Envelope - Mengembalikan geometri yang mewakili kotak pembatas dari geometri yang disediakan

, bersama dengan fungsi agregat ST_Unionuntuk memperoleh penyatuan semua geometri (atau penyatuan amplop masing-masing) sebagai berikut:

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

atau

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

Opsi kedua harus lebih cepat karena menyederhanakan operasi penyatuan dengan menggunakan amplop geometri individu.

lihat Sumber .


1
Pendekatan ST_Extent adalah magnitudo lebih cepat karena dapat beroperasi murni pada angka dan tidak harus melakukan perhitungan geometrik yang kompleks. Hindari ST_Union kapan pun Anda bisa.
bugmenot123

2

Tidak menerapkan agregasi spasial apa pun harus lebih cepat:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x

1
ST_Extent juga tidak harus melakukan apa pun secara spasial. Ini 2-3 kali lebih cepat daripada pendekatan Anda untuk data saya (~ 400rb poligon). Mungkin karena itu bisa melakukan semuanya sekaligus, sementara pendekatan Anda harus melihat beberapa aspek dari masing-masing geom dan kemudian mengumpulkan pada akhirnya.
bugmenot123
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.