Bagaimana cara menggabungkan semua poligon yang memotong dan meninggalkan yang lain tanpa perubahan postgis?

8

Yang saya butuhkan adalah menyatukan poligon berpotongan dalam satu geometri dan membiarkan yang lain tanpa perubahan.

masukkan deskripsi gambar di sini

Saya dapat melakukan ini menggunakan kueri berikut, yang menyatukan semua poligon menjadi satu geometri dan kemudian membuangnya ke yang terpisah.

INSERT INTO unioned(geom)
SELECT ST_MULTI((ST_Dump(ST_Union(geom))).geom) from footprints;

masukkan deskripsi gambar di sini

Masalahnya adalah bahwa saya memiliki lebih dari satu juta baris dalam database dan ST_Unionoperasi tidak pernah berakhir. Apakah ada cara untuk mencapai hal yang sama tanpa bergabung dengan semua geometri?

Serhey Ladonya
sumber

Jawaban:

7

Berikut adalah pendekatan berbeda yang saya harapkan akan jauh lebih cepat untuk tipe data yang Anda perlihatkan di atas:

ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) FROM footprints;

Kueri ini:

  1. Menggunakan ST_ClusterIntersectinguntuk menemukan kelompok-kelompok membangun jejak kaki yang membentuk "rantai persimpangan", dan menempel masing-masing kelompok menjadi a GeometryCollection. Mengembalikan array.
  2. Menggunakan unnestarray koleksi geometri menjadi satu baris untuk setiap koleksi geometri.
  3. Menggunakan ST_UnaryUnionuntuk menyatukan item dalam setiap koleksi geometri.
dbaston
sumber
Banyak terima kasih atas balasan Anda @dbaston. Apakah Anda tahu mengapa ST_ClusterIntersectingmengembalikan geometri dengan SRID = 0? Bagaimana ini bisa diselesaikan? Mencoba menjalankan permintaan berikut: INSERT INTO fixed_footprints(geom) SELECT ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))) as geom FROM footprints;Saya mendapat kesalahan berikut:[22023] ERROR: Geometry SRID (0) does not match column SRID (4326)
Serhey Ladonya
pikir saya memecahkan ini: INSERT INTO fixed_footprints(geom) SELECT ST_Multi(st_setsrid(ST_UnaryUnion(unnest(ST_ClusterIntersecting(geom))), 4326)) as geom FROM footprints;Akan mencoba ini pada set yang lebih besar
Serhey Ladonya
@SerheyLadonya sepertinya masalah SRID adalah bug ST_ClusterIntersecting. Terima kasih telah menunjukkannya, saya akan memperbaikinya.
dbaston