我正在尝试使用PostGis 2.1(和Postgres SQL 9.3)使用ST_Difference创建一组多边形(processing.trimmedparcelsnew),这些多边形不包含另一组多边形(test.single_geometry_1)所覆盖的任何区域。这是我的查询:
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;
但是生成的多边形尚未修剪,相反,它们似乎在与另一层相交的地方被拆分了。我试过只运行选择而不将结果放在表中以及其他我能想到的东西,但是我似乎无法使该功能正常工作。
我已附上结果图
评论后,我尝试添加WHERE子句。我希望没有交集的宗地,而其他宗地的相交区域被删除(图层test.single_geometry表示要从宗地中删除的污染)。我尝试了一个相交,但是我当然想要非相交,所以我现在尝试分离。我也尝试过将折纸添加到表中,但是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.geometriestocut的原始修剪时,这仍然仅会导致原始多边形(test.geometriestocut)。
WHERE
子句,因此结果表中可能具有多项式展开。有多少行trimmedparcelsnew
?