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
?Jawaban:
Gabung sendiri memungkinkan Anda untuk beroperasi pada hubungan antara pasangan dari dua fitur. Tapi saya tidak berpikir Anda tertarik berpasangan: untuk setiap fitur, Anda ingin beroperasi pada hubungan antara fitur itu dan semua fitur lainnya dalam dataset Anda. Anda dapat melakukannya dengan ekspresi subquery:
Anda mungkin melihat sesuatu yang aneh dalam hasilnya. Paket yang tidak memiliki tumpang tindih sedang dibatalkan seluruhnya! Itu karena
ST_Union
agregat pada recordset kosong akan menjadiNULL
, danST_Difference(geom, NULL)
sekarangNULL
. Untuk memperlancar hal ini, Anda harus membungkusST_Difference
panggilan Anda dalamCOALESCE
:Ini berarti bahwa jika hasilnya
ST_Difference
adalahNULL
, ekspresi yang digabungkan akan mengevaluasi ke geometri asli.Kueri di atas akan menghapus area yang tumpang tindih dari domain Anda sepenuhnya. Jika Anda ingin memilih pemenang, Anda bisa melakukannya
a.id < b.id
, atau kriteria lain, alih-aliha.id != b.id
.sumber
Saya memiliki masalah yang sama seperti Anda. Saya tidak tahu apakah Anda sudah menemukan solusi untuk masalah Anda, tetapi saya memodifikasi jawaban yang diterima di atas dan saya mendapatkan apa yang saya inginkan.
sumber
Saya menggunakan ST_DifferenceAgg () dari AddG PostGIS . Anda harus menggabungkan kedua tabel bersama, memiliki pengidentifikasi unik dan indeks pada kolom geometri. Ini adalah contoh singkat:
Ini akan menggabungkan bagian yang tumpang tindih dengan poligon tumpang tindih terbesar. Jika Anda ingin menjaga agar bagian yang tumpang tindih terlihat terpisah pada contoh ST_splitAgg ().
sumber