SQL-запрос PostGIS и неверные геометрии - PullRequest
1 голос
/ 27 апреля 2011

У меня есть база данных postgis, импортированная с помощью osm2pgsql. Очевидно, есть много неправильных геометрий, что приводит к ошибкам с некоторыми пространственными операциями.

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 голосов
/ 27 апреля 2011

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 к недопустимым геометриям.

Однако это не кажется мне правильным решением.Не могли бы вы предоставить образец "неверной геометрии", созданной при импорте?

...