PostGIS SQL查询和无效的几何

时间:2011-04-27 09:29:49

标签: sql postgis

我有一个用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)
);

但是这个查询似乎将缓冲操作应用于表中的所有条目。您如何仅将此操作限制为无效几何?

提前谢谢!

1 个答案:

答案 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应用于无效的几何图形。

然而,这对我来说似乎不是一个正确的解决方案。请提供导入产生的“无效几何”样本?