Я ищу функцию для растворения общих границ между полигонами в таблице. ST_UNION () почти делает то, что я ищу, но он создает мультиполигон из всех многоугольников слоя независимо от того, имеют ли они общую границу или нет. Я бы предпочел только расторгнуть границы между полигонами, которые касаются друг друга. Я подумал, что должен быть какой-то способ использования ST_TOUCHES (), но тогда потребность в функции растворения кажется настолько распространенной, что я был бы удивлен, если бы не было встроенной функции для достижения этой цели.
Вариант использования выглядит следующим образом: я скачал данные Corine Landcover для большой европейской страны, и я хочу растворить границы между разными типами лесов (около 75 000 полигонов в одной таблице). Я пробовал ST_UNION, но он не дает мне выполнить ошибку «недостаточно памяти» (хотя 30 000 полигонов работали):
create table corine00 as
select st_union(the_geom) as the_geom,
sum(area_ha) as area_ha,
substr(code_00,1,2) as code_00
from clc00_c31_forests
group by substr(code_00,1,2)
Примечание. Все коды лесов начинаются с «31», и я использую PostGIS 1.4, версия GEOS: 3.2.0-CAPI-1.6.0
Я считаю, что ST_Dump - это то, что вы хотите:
ST_Dump :
Итак, для вашего случая:
Я не уверен, как это будет взаимодействовать с созданием таблицы, которую вы пытаетесь сделать, но это должно дать вам геометрию как отдельные записи. После этого вы сможете выполнить пространственное соединение (используя && и ST_Contains) между двумя таблицами, чтобы собрать данные в геометрии.
источник
Ваш PostGIS скомпилирован с GEOS 3.1.0+? Для этой версии было реализовано гораздо более быстрое каскадное объединение , но если его не найти, будет использоваться более старый код, который на несколько порядков медленнее.
Обновление : похоже, что ваш PostGIS использует подход каскадного объединения, но нехватка памяти реальна. Я бы попробовал увеличить объем доступной памяти для вашего экземпляра Postgres, вот несколько советов Пола Рэмси из FOSS4G PostGIS за 2007 год :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
В вашем случае, я бы попытался увеличить
shared_buffers
, общая рекомендация - 25% вашей доступной памяти для сервера базы данных, но попробуйте увеличить его до 3-4-кратного его текущего значения и посмотреть, завершится ли он.источник