Sto cercando di usare ST_Difference per creare un set di poligoni (processing.trimmedparcelsnew) che non contengono alcuna area coperta da un altro set di poligoni (test.single_geometry_1) usando PostGis 2.1 (e Postgres SQL 9.3). Ecco la mia domanda:
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;
Ma i poligoni risultanti non sono stati tagliati, ma sembrano essere stati divisi nel punto in cui si intersecano con l'altro livello. Ho provato a eseguire la selezione senza inserire il risultato in una tabella e tutto ciò a cui riesco a pensare, ma non riesco a far funzionare questa funzione.
Ho allegato una foto del risultato
Dopo i commenti, ho provato ad aggiungere una clausola WHERE. Voglio i pacchi che non hanno intersezioni e le aree intersecanti degli altri pacchi rimossi (il livello test.single_geometry rappresenta la contaminazione che desidero rimuovere dai miei pacchi). Ho provato un incrocio ma ovviamente voglio davvero i non incroci, quindi ora sto provando un disgiunto. Ho anche provato ad aggiungere l'orig alla mia tabella ma la documentazione per ST_Difference ( http://postgis.net/docs/ST_Difference.html ) dice che restituisce la geometria esatta di cui ho bisogno (una geometria che rappresenta quella parte della geometria A che non si interseca con la geometria B), quindi sono confuso sul motivo per cui vorrei il poligono originale nella mia tabella. Comunque, ecco il mio codice modificato:
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);
A seguito della risposta di dbaston, ora ho provato:
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;
Il risultato è solo una copia di test.multi_geometry_1. Anche se ora la divisione non si verifica più.
Ho provato la versione precedente, ma ho appena ricevuto una copia di 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;
Sto iniziando a chiedermi se c'è qualcos'altro che sto facendo di sbagliato? La dichiarazione procedurale è:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
E sto eseguendo le query dalla finestra delle query SQL di PostgreSQL e Openjump.
L'affermazione che uso per vedere la tabella è:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
Nell'interesse della semplificazione ho ridotto questa query a solo:
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;
Ciò comporta ancora solo i poligoni originali (test.geometriestocut) quando il risultato desiderato è l'originale tagliato rispetto a test.geometriestocutagainst.
WHERE
clausola, quindi potresti avere un'espansione polinomiale nella tabella risultante. Quante righe ci sonotrimmedparcelsnew
?