Saya berjuang dengan masalah selama beberapa hari dan menyadari banyak orang juga terjebak ketika topiknya adalah persimpangan di PostGIS (v2.5). Itu sebabnya saya memutuskan untuk menanyakan pertanyaan umum yang lebih rinci dan umum.
Saya memiliki tabel berikut:
DROP TABLE IF EXISTS tbl_foo;
CREATE TABLE tbl_foo (
id bigint NOT NULL,
geom public.geometry(MultiPolygon, 4326),
att_category character varying(15),
att_value integer
);
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(1, ST_SetSRID('MULTIPOLYGON (((0 6, 0 12, 8 9, 0 6)))'::geometry,4326) , 'cat1', 2 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(2, ST_SetSRID('MULTIPOLYGON (((5 0, 5 12, 9 12, 9 0, 5 0)))'::geometry,4326), 'cat1', 1 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(3, ST_SetSRID('MULTIPOLYGON (((4 4, 3 8, 4 12, 7 14,10 12, 11 8, 10 4, 4 4)))'::geometry,4326) , 'cat2', 5 );
Ini terlihat seperti ini:
Saya ingin mendapatkan semua poligon anak berdasarkan persimpangan poligon induk. Untuk hasilnya, itu diharapkan:
- Poligon anak tanpa tumpang tindih di antara mereka.
- Kolom yang berisi jumlah nilai poligon induknya,
- Kolom yang berisi jumlah poligon induk dari satu kategori
- Kolom yang berisi jumlah kategori lain
- Kolom yang berisi kategori poligon anak, berdasarkan aturan berikut: -Jika SEMUA poligon induk berasal dari satu kelas, poligon anak juga memiliki kelas ini. Selain itu, kategori poligon anak adalah kategori ketiga.
Jadi akan terlihat seperti itu:
Jadi, pada akhirnya, tabel output yang dihasilkan (untuk contoh ini) akan memiliki 7 baris (semua 7, tidak tumpang tindih, poligon anak), yang berisi kolom category
, sum_value
, ct_overlap_cat1
,ct_overlap_cat2
Kode berikut ini saya mulai, memberi saya persimpangan individual, membandingkan satu orangtua dengan yang lain.
SELECT
(ST_Dump(
ST_SymDifference(a.geom, b.geom)
)).geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom)
UNION ALL
SELECT
ST_Intersection(a.geom, b.geom) as geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom);
Bagaimana cara mengulang secara berulang melalui hasil kode yang disebutkan ini, bahwa, terlepas dari jumlah poligon yang tumpang tindih, saya selalu mendapatkan poligon terkecil (anak) (Gbr. 2)?
Saya kira jika Anda menggunakan tipe geometri poligon bukan MultiPolygon semuanya akan jatuh ke tempatnya:
Hasilnya adalah 9 entri yang sesuai dengan opsi persimpangan berbeda dalam contoh yang diberikan oleh Anda.
sumber