2011-04-27 27 views
1

我有一个用osm2pgsql导入的postgis数据库。显然,有很多无效的几何图形会导致一些空间操作出错。PostGIS的SQL查询和无效的几何图形

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

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无效的几何形状。

但是,这似乎不是一个正确的解决方案给我。请提供一个由导入产生的“无效几何体”样本?

+0

最常见的错误是自交。 – 2011-04-27 09:39:56