#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
к недопустимым геометриям.
Однако мне это не кажется правильным решением. Не могли бы вы предоставить образец «недопустимой геометрии», созданный в результате импорта?