Чи є функція розчинення в PostGIS, крім st_union?


22

Я шукаю функцію для розчинення спільних меж між ознаками полігону в таблиці. 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

Відповіді:


21

ST_MemUnion () запустить наївний і повільний процес, сприятливий для пам'яті. Ви можете спробувати, що якщо ваша проблема досить мала, вона може закінчитися за розумну кількість часу. Ви також можете просто розбити проблему на половинки, а потім запустити половинки разом. Оскільки у результатів буде набагато менше очок, ніж вхідних даних, ви, таким чином, зможете вкласти всю проблему в пам'ять. Або використовуйте швидку процедуру голодної пам’яті на половинках і повільну процедуру на остаточному злитті.


4
Фантастично мати вас тут, Пол, дякую за те, що ви отримали незрівнянний досвід.
відмітка

1
Дякую, схоже, моя проблема недостатньо мала. ST_MemUnion () працює вже 24 години. Я спробую розділити проблему.
underdark

5

Я вважаю, що ST_Dump - це те, що ви хочете:

ST_Dump :

Повертає набір рядків geometry_dump (geom, path), які складають геометрію g1 .... Наприклад, його можна використовувати для розширення MULTIPOLYGONS на POLYGONS....

Отже, для вашого випадку:

 SELECT (ST_Dump( ST_Union( the_geom ) )).geom
 FROM clc00_c31_forests
 GROUP BY substr(code_00,1,2)

Я не впевнений, як це буде взаємодіяти зі створенням таблиці, яку ви намагаєтеся зробити, але це повинно дати вам геометрії як окремі записи. Тоді ви зможете зробити просторове з'єднання (використовуючи && та ST_Contains) між двома таблицями для збору даних на геометрії.


2
Примітка: це стане в нагоді лише в тому випадку, якщо ви отримаєте проблеми з пам'яттю ST_Union! :)
yhw42

4

Ваш PostGIS складений проти GEOS 3.1.0+? Для цієї версії було реалізовано набагато швидший каскадний союз , але якщо його не знайти, використовуватиметься старіший код, який на порядок менший.

Оновлення : схоже, що ваш PostGIS використовує каскадний підхід об'єднання, але голодування пам'яті справжнє. Я б спробував збільшити доступну пам'ять для вашого екземпляра Postgres, ось кілька порад з розмови про FOSS4G PostGIS 2007 року Пола Рамзі :

  • Доступ до диска повільний, тому більш високу продуктивність можна отримати, використовуючи більше пам'яті для кешування даних!
    • Збільшити shared_buffers
    • Фізична ОЗУ - ОС потребує * 75%
  • Сортування проходить швидше в пам'яті
    • Збільшити work_mem
  • Очищення диска відбувається швидше з більшою кількістю пам'яті
    • Збільшити maintenance_work_mem
  • Виділено на з'єднання
  • Також
    • Збільшити wal_buffers
    • Збільшити checkpoint_segments
    • Зменшити random_page_cost

У вашому випадку я б спробував збільшити shared_buffers, загальна рекомендація - це 25% вашої доступної пам’яті для сервера баз даних, але спробуйте збільшити її до 3-4x свого поточного значення та побачити, чи завершується він.


postgis_geos_version () повертає: 3.2.0-CAPI-1.6.0 ... Я думаю, це добре. Спробую ST_Collect, дякую.
underdark

Ну, ST_Collect, здається, не розчиняє жодних кордонів, і він також створює один гігантський мультиполігон.
underdark

так, я неправильно прочитав сторінку для ST_Collect. Я оновив свою відповідь, щоб надати більш конкретні поради щодо налаштування використання пам’яті Postgres.
scw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.