SQL-запрос PostGIS и недопустимые геометрии

#sql #postgis

#sql #postgis

Вопрос:

У меня есть база данных 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:

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

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