我有一个用osm2pgsql导入的postgis数据库。显然,有许多无效的几何形状会导致某些空间操作出错。
geometry.buffer(x)似乎解决了这个问题,但是这个操作需要花费很多时间。所以,我想将它仅应用于无效的几何:
select * from
(
select *
from polygons
WHERE NOT IsValid(polygons.geom)
) as tbl
where ST_Intersects(
ST_Buffer(tbl.geom, 0.001),
GeomFromText('POLYGON ((XY))', 4326)
);
但是这个查询似乎将缓冲操作应用于表中的所有条目。您如何仅将此操作限制为无效几何?
提前谢谢!
答案 0 :(得分:0)
PostgreSQL
优化器会在优化之前扩展内联视图,因此无法保证谓词不会被推入或拖出视图。
另一方面,CTE
始终具体化,因此查询:
WITH tbl AS
(
SELECT *
FROM polygons
WHERE NOT IsValid(polygons.geom)
)
SELECT *
FROM tbl
WHERE ST_Intersects
(
ST_Buffer(tbl.geom, 0.001),
GeomFromText('POLYGON ((XY))', 4326)
);
只会将ST_buffer
应用于无效的几何图形。
然而,这对我来说似乎不是一个正确的解决方案。请提供导入产生的“无效几何”样本?