ST_Difference를 사용하여 PostGis 2.1 (및 Postgres SQL 9.3)을 사용하여 다른 다각형 세트 (test.single_geometry_1)로 커버되는 영역을 포함하지 않는 다각형 세트 (processing.trimmedparcelsnew)를 만들려고합니다. 내 쿼리는 다음과 같습니다.
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;
그러나 결과로 생성 된 다각형은 다듬어지지 않았으며 다른 레이어와 교차하는 지점에서 분할 된 것으로 보입니다. 결과를 테이블에 넣지 않고 다른 것을 생각하지 않고 select를 실행하려고 시도했지만이 기능을 작동시킬 수없는 것 같습니다.
결과의 그림을 첨부했습니다
의견을 말한 후 WHERE 절을 추가하려고했습니다. 교차점이없는 소포를 원하고 다른 소포의 교차 영역이 제거되었습니다 (층 test.single_geometry는 필자가 소포에서 제거한 오염을 나타냅니다). 나는 교차를 시도했지만 물론 비 교차를 원하므로 이제는 분리를 시도하고 있습니다. 나는 또한 내 테이블에 orig를 추가하려고 시도했지만 ST_Difference ( http://postgis.net/docs/ST_Difference.html )에 대한 문서는 필요한 정확한 형상 (지오메트리 A의 해당 부분을 나타내는 형상)을 반환한다고 말합니다. 지오메트리 B)와 교차하지 않으므로 대신 테이블의 원래 다각형을 원할 이유가 혼란 스럽습니다. 어쨌든, 여기 수정 된 코드가 있습니다.
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);
dbaston의 답변에 따라 이제 시도했습니다.
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;
그 결과는 test.multi_geometry_1의 사본 일뿐입니다. 이제 분할이 더 이상 발생하지 않습니다.
이전 버전을 시도했지만 다시 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;
내가 잘못하고있는 것이 있는지 궁금해하고 있습니다. 진행 진술은 다음과 같습니다
DROP TABLE IF EXISTS processing.parcels_trimmed_no_coalesce;
그리고 PostgreSQL SQL 쿼리 창과 Openjump에서 쿼리를 실행하고 있습니다.
표를 보는 데 사용하는 진술은 다음과 같습니다.
SELECT * FROM processing.parcels_trimmed_no_coalesce;
단순화를 위해이 쿼리를 다음과 같이 줄였습니다.
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;
원하는 결과가 test.geometriestocutagainst에 대해 트리밍 된 원본 일 때 여전히 원래 다각형 (test.geometriestocut)이됩니다.
WHERE
절을 지정하지 않았 으므로 결과 테이블에 다항식 확장이있을 수 있습니다. 행이 몇 개trimmedparcelsnew
입니까?