Saat memotong poligon dari satu tabel dengan poligon di yang lain, ST_Intersection dapat mengembalikan serangkaian hasil yang dapat ditangani dengan ST_Dump. Beberapa geometri yang dikembalikan tidak harus ST_Polygon tetapi juga ST_LineString (mungkin juga sebuah titik). Jadi saat menjalankan kueri
INSERT INTO c (geom)
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom));
ketika mencoba mengisi tabel "c" dengan poligon terpotong, ia gagal dengan ERROR: Tipe geometri (LineString) tidak cocok dengan tipe kolom (Poligon)
Saya melakukan pernyataan SELECT bersarang lain sehingga hanya geometri poligon yang datang, seperti:
INSERT INTO c (geom)
(SELECT geom FROM
(SELECT (ST_Dump(ST_Intersection(a.geom,b.geom))).geom
FROM a INNER JOIN b ON ST_Intersects(a.geom, b.geom))) AS cl
WHERE ST_GeometryType(cl.geom)='ST_Polygon');
Karena ini agak rumit saya bertanya-tanya apakah ada solusi yang lebih elegan untuk menjatuhkan geometri yang tidak valid?
{}
atas jendela pengeditan Pertanyaan.Jawaban:
Ini mungkin tempat yang bagus untuk menggunakan fungsi SQL-language. Berikut ini yang cepat yang dapat digunakan untuk situasi ini:
Ini akan mempertahankan komponen poligonal dari persimpangan, tetapi membuang semua yang lainnya. Itu selalu mengembalikan MultiPolygon, bahkan jika Anda memiliki satu atau tidak ada komponen.
sumber
Jawaban yang sangat bagus dari @dbaston. Namun, mengembalikan geometri kosong bukan nol dapat menyebabkan masalah karena geometri kosong yang dikembalikan tidak memiliki srid. St_Intersection mungkin mengembalikan MultiPolygon juga. Fungsi yang diperbarui ini sangat berguna bagi saya:
sumber