Как ускорить разбиение пространства в 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 минут (linemerge () на самом деле нет). Polys - это MultiPolygons на случай, если st_dump вас не устраивает.

У вас есть совет? St_union () линейной работы - очень медленная часть.

Спасибо,

Нико.

PS: вот некоторые числа: 852 мультиполигона, что приводит к 14880 полигонам, что приводит к 21467 линейным строкам, что составляет 315513 вершин.

nraynaud
источник
Если никто не отвечает, вы можете попробовать список рассылки postGIS.
ГИС-Джонатан
Я не очень люблю списки рассылки, более того, это также может быть проблема 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 (насколько я могу судить.)

SCRo
источник
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;

Сделал бы трюк.

LR1234567
источник
привет, вот результат: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6 марта 2012 г. "LIBXML =" 2.7.3 "USE_STATS". Я не мог найти какое-либо соответствующее дополнение к союзу в GEOS в последнее время. Я обнаружил одно ускорение в объединениях многоугольников, но я не объединяю многоугольники, и это ускорение кажется спорным. Я абсолютно не хочу объединять мои полигоны, так как я должен добавить значения для перекрывающихся полигонов.
nraynaud