Ich versuche, ST_Difference zu verwenden, um mit PostGis 2.1 (und Postgres SQL 9.3) einen Satz von Polygonen (process.trimmedparcelsnew) zu erstellen, die keinen der Bereiche enthalten, die von einem anderen Satz von Polygonen (test.single_geometry_1) abgedeckt werden. Hier ist meine Frage:
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;
Die resultierenden Polygone wurden jedoch nicht zugeschnitten, sondern scheinen dort geteilt worden zu sein, wo sie sich mit der anderen Schicht schneiden. Ich habe versucht, nur die Auswahl auszuführen, ohne das Ergebnis in eine Tabelle und alles andere, was mir einfällt, einzutragen, aber ich kann diese Funktion anscheinend nicht zum Laufen bringen.
Ich habe ein Bild des Ergebnisses angehängt
Nach Kommentaren habe ich versucht, eine WHERE-Klausel hinzuzufügen. Ich möchte, dass die Pakete, die keine Schnittpunkte haben, und die Schnittbereiche der anderen Pakete entfernt werden (die Ebene test.single_geometry repräsentiert die Kontamination, die ich von meinen Paketen entfernen möchte). Ich habe eine Kreuzung versucht, aber natürlich möchte ich eigentlich die Nicht-Kreuzungen, also versuche ich jetzt eine Disjunktion. Ich habe auch versucht, das orig zu meiner Tabelle hinzuzufügen, aber die Dokumentation für ST_Difference ( http://postgis.net/docs/ST_Difference.html ) besagt, dass es genau die Geometrie zurückgibt, die ich brauche (eine Geometrie, die den Teil der Geometrie A darstellt, der schneidet sich nicht mit der Geometrie B), daher bin ich verwirrt, warum ich stattdessen das ursprüngliche Polygon in meiner Tabelle haben möchte. Wie auch immer, hier ist mein geänderter Code:
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);
Nach der Antwort von dbaston habe ich jetzt versucht:
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;
Das Ergebnis ist nur eine Kopie von test.multi_geometry_1. Obwohl jetzt die Aufteilung nicht mehr stattfindet.
Ich habe die frühere Version ausprobiert, erhalte aber erneut eine Kopie von 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;
Ich frage mich, ob ich noch etwas falsch mache. Die folgende Erklärung lautet:
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
Und ich führe die Abfragen aus dem PostgreSQL SQL-Abfragefenster und Openjump aus.
Die Aussage, mit der ich die Tabelle sehe, lautet:
SELECT * FROM processing.parcels_trimmed_no_coalesce;
Im Interesse der Vereinfachung habe ich diese Abfrage jetzt auf nur Folgendes reduziert:
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;
Dies führt immer noch nur zu den ursprünglichen Polygonen (test.geometriestocut), wenn das gewünschte Ergebnis das Original ist, das gegen test.geometriestocut gegen getrimmt wurde.
WHERE
Klausel angegeben, sodass die resultierende Tabelle möglicherweise eine Polynomerweiterung enthält. Wie viele Zeilen sind intrimmedparcelsnew
?