Як пришвидшити розділення місця в postgis?


9

У мене є купа полігонів, що перекриваються, і я намагаюся розділити простір, щоб уникнути перекриття. Я думаю, що моя проблема досить проста. Використовуючи якийсь продукт ESRI та http://arcscripts.esri.com/details.asp?dbid=16700, мій колега обчислив його за 48 років.

Я намагаюся зробити це з postgis, використовуючи http://s3.opengeo.org/postgis-power.pdf#page=24 (відгадуючи деталі, використовуючи http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology як натхнення), але це так повільно, що я не можу зробити це з більш ніж 10 полісами (у мене 800 з них, щоб розділитись). Повільна частина - це ST_Union, я пробував різні речі, але жодна, де це було успішно, ось поточний стан справ:

select geom from
(select st_linemerge(st_union(geom)) as geom from
    (select st_exteriorring((st_dumprings((st_dump(t.geom)).geom)).geom) as geom from
        (SELECT geometry AS geom, id
               FROM tt
              WHERE campaign_id = 204
              ORDER BY id limit 200) t) t2) t3

це обчислюється протягом 26 хв (лінемерге () насправді немає). Поліс - це багатополігони на випадок, коли st_dump вас клопоче.

У вас є якась порада? St_union () лінійної роботи - це дуже повільна частина.

Дякую,

Ніко.

PS: Ось декілька чисел: 852 багатокутників, що ведуть до 14880 багатокутників, що веде до 21467 рядків на загальну суму 315513 вершин.


Якщо ніхто не відповів, ви можете спробувати список розсилки postGIS.
GIS-Jonathan

Я не дуже прихильник списків розсилки, крім того, це може бути і проблема GEOS, хто може скаржитися на JTS, ну я вважаю за краще тримати проблему відкритою.
nraynaud

збираючи лінійну роботу та роблячи об'єднання з порожньою геометрією, я можу це зробити в 800-х: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)), що майже в 20 разів повільніше, ніж речі ESRI.
nraynaud

1
з пам’яті, спробуйте скинути st_union від st_linemerge (st_union ...), якщо це допоможе
simplexio

Відповіді:


3

Ця відповідь може не допомогти @nraynaud безпосередньо, але, сподіваємось, прожене трохи теми.

У SpatiaLite <4.0 є аналогічна проблема через проблему з GEOS. Дивіться це посилання для обговорення цього питання.

Вирішення завдання полягає в заміні функції ST_Union () на ST_UnaryUnion (ST_Collect ()). На жаль, ST_UnaryUnion недоступний до postGIS 2.0 (наскільки я можу сказати.)


1

Яку версію PostGIS ви використовуєте? Об’єднання відбувається набагато повільніше, якщо ви використовуєте PostGIS <1.4 або GEOS <3.2. Набагато швидше об'єднання було введено в 1.4, але також вимагає GEOS 3.2+. Тож спочатку, якщо ви використовуєте менше 1,4, я б оновив принаймні 1,5.

SELECT postgis_full_version();

Перевіряти.

Також є ваш намір зберегти початкові краї полігонів. Якщо ви просто хочете розчинити перекриваються ділянки,

SELECT ST_Union(geom) FROM tt WHERE campaign_id = 204;

Зробив би трюк.


привіт, ось результат: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Відн. 4.8.0, 6 березня 2012 "LIBXML =" 2.7.3 "USE_STATS". Нещодавно я не зміг знайти жодного відповідного доповнення до об'єднання в GEOS. Я знайшов одну прискорення у багатокутних об'єднаннях, але полігони не зливаю, і ця швидкість здається суперечливою. Я абсолютно не хочу об'єднувати свої багатокутники, оскільки мені потрібно додати значення для полігонів, що перекриваються.
nraynaud
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.