Saya mencoba menggunakan ST_Difference untuk membuat satu set poligon (processing.trimmedparcelsnew) yang tidak mengandung area yang dicakup oleh set poligon lain (test.single_geometry_1) menggunakan PostGis 2.1 (dan Postgres SQL 9.3). Ini pertanyaan saya:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig;
Tetapi poligon yang dihasilkan belum dipangkas, sebaliknya mereka tampaknya telah terbelah di mana mereka berpotongan dengan lapisan lainnya. Saya telah mencoba menjalankan pemilihan tanpa meletakkan hasilnya dalam tabel dan semua hal lain yang dapat saya pikirkan, tetapi sepertinya saya tidak dapat menjalankan fungsi ini.
Saya telah melampirkan gambar hasilnya
Setelah komentar, saya telah mencoba menambahkan klausa WHERE. Saya ingin parsel yang tidak memiliki persimpangan, dan area berpotongan dari parsel lainnya dihapus (layer test.single_geometry mewakili kontaminasi yang ingin saya hapus dari paket saya). Saya mencoba persimpangan tetapi tentu saja saya benar-benar ingin persimpangan bukan jadi saya sekarang mencoba memisahkan. Saya juga telah mencoba menambahkan orig ke meja saya tetapi dokumentasi untuk ST_Difference ( http://postgis.net/docs/ST_Difference.html ) mengatakan ia mengembalikan geometri tepat yang saya butuhkan (geometri yang mewakili bagian geometri A yang tidak berpotongan dengan geometri B), jadi saya bingung mengapa saya ingin poligon asli di meja saya sebagai gantinya. Bagaimanapun, ini adalah kode saya yang dimodifikasi:
CREATE TABLE processing.trimmedparcelsnew AS
SELECT
orig.id, ST_Difference(orig.geom, cont.geom) AS difference, orig.geom AS geom
FROM
test.single_geometry_1 cont,
test.multi_geometry_1 orig
WHERE ST_Disjoint(orig.geom, cont.geom);
Mengikuti dari jawaban dbaston sekarang saya telah mencoba:
CREATE TABLE processing.parcels_trimmed AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
Hasil ini hanyalah salinan test.multi_geometry_1. Padahal sekarang perpecahan tidak lagi terjadi.
Saya mencoba versi sebelumnya, tetapi sekali lagi hanya mendapatkan salinan test.multi_geometry_1:
CREATE TABLE processing.parcels_trimmed_no_coalesce AS
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.single_geometry_1 b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.multi_geometry_1 a;
Saya mulai bertanya-tanya apakah ada hal lain yang saya lakukan salah? Pernyataan yang dilanjutkan adalah:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
Dan saya menjalankan kueri dari jendela kueri PostgreSQL SQL dan Openjump.
Pernyataan yang saya gunakan untuk melihat tabel adalah:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
Untuk kepentingan penyederhanaan, sekarang saya mengurangi kueri ini menjadi:
SELECT id, COALESCE(ST_Difference(geom, (SELECT ST_Union(b.geom)
FROM test.geometriestocutagainst b
WHERE ST_Intersects(a.geom, b.geom)
AND a.id != b.id)), a.geom)
FROM test.geometriestocut a;
Ini masih menghasilkan hanya poligon asli (test.geometriestocut) ketika hasil yang diinginkan adalah yang asli dipangkas terhadap test.geometriestocutagainst.
WHERE
klausa, jadi Anda mungkin memiliki ekspansi polinomial di tabel yang dihasilkan. Ada berapa baristrimmedparcelsnew
?