Como acelerar o particionamento de espaço no postgis?

9

Eu tenho vários polígonos sobrepostos e estou tentando particionar o espaço para evitar os sobrepostos. Eu acho que meu problema é bastante simples. Usando algum produto ESRI e http://arcscripts.esri.com/details.asp?dbid=16700, meu colega de trabalho calculou em 48s.

Estou tentando fazer isso com o postgis usando http://s3.opengeo.org/postgis-power.pdf#page=24 (adivinhando os detalhes, usando http://trac.osgeo.org/postgis/wiki/UsersWikiSimplifyPreserveTopology como inspiração), mas é tão lento que não posso fazer isso com mais de 10 polys (tenho 800 deles para dividir). A parte lenta é a ST_Union, tentei várias coisas, mas nenhuma foi bem-sucedida, aqui está o estado atual:

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

isso calcula há 26 minutos (o linemerge () na verdade não é). As polys são MultiPolygons, caso o st_dump o incomode.

Você tem alguma dica? O st_union () do trabalho de linha é a parte muito lenta.

Obrigado,

Nico.

PS: aqui estão alguns números: 852 multipolígonos, levando a 14880 polígonos, levando a 21467 cadeias de linhas, totalizando 315513 vértices.

nraynaud
fonte
Se ninguém responder, você pode tentar a lista de discussão postGIS.
GIS-Jonathan
Não sou muito fã de listas de discussão; além disso, também pode ser um problema do GEOS, que pode reclamar do JTS, bem, prefiro manter o problema em aberto.
Nraynaud
coletando o trabalho de linha e fazendo uma união com uma geometria vazia, eu posso fazer isso nos anos 800: st_union (st_collect (geom), st_setsrid (geomfromtext ('POINT EMPTY'), 900913)) quase 20 vezes mais lento que o material da ESRI.
Nraynaud
11
da memória, tente soltar st_union de st_linemerge (st_union ...) se ajudar #
simplexio 26/10/12

Respostas:

3

Essa resposta pode não ajudar diretamente a @nraynaud, mas espero esclarecer um pouco sobre o assunto.

Há um problema semelhante no spatiaLite <4.0 devido a um problema no GEOS. Veja este link para uma discussão sobre o problema.

A solução alternativa é substituir a função ST_Union () por ST_UnaryUnion (ST_Collect ()). Infelizmente, ST_UnaryUnion não está disponível até o postGIS 2.0 (tanto quanto eu sei.)

Scro
fonte
1

Qual versão do PostGIS você está usando? A união é muito mais lenta se você estiver usando PostGIS <1.4 ou GEOS <3.2. Uma união muito mais rápida foi introduzida na 1.4, mas também requer o GEOS 3.2+. Então, primeiro, se você estiver usando menos de 1,4, atualizaria para pelo menos 1,5.

SELECT postgis_full_version();

Checar.

Também é sua intenção manter as arestas originais dos polígonos. Se você apenas deseja dissolver áreas sobrepostas,

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

Faria o truque.

LR1234567
fonte
Olá, aqui está o resultado: "POSTGIS =" 1.5.3 "GEOS =" 3.3.2-CAPI-1.7.2 "PROJ =" Rel. 4.8.0, 6 de março de 2012 "LIBXML =" 2.7.3 "USE_STATS". Não encontrei nenhuma adição relevante à união no GEOS recentemente. Encontrei uma aceleração em uniões poligonais, mas não estou mesclando polígonos, e essa aceleração parece controversa. Eu absolutamente não quero unir meus polígonos, pois tenho que adicionar valores para polígonos sobrepostos.
Nraynaud