Dissolver polígonos em QGIS (GEOS) com tolerância

11

Eu tenho uma camada vetorial de polígono representando a área inundada em uma inundação. A camada foi produzida de tal maneira que algumas áreas são compostas por vários polígonos menores que tocam (veja a captura de tela abaixo, denominada "dados originais").

Eu gostaria de dissolver os polígonos onde eles tocam. Se eu usar a ferramenta de geoprocessamento dissolve no fTools do QGIS, que usa a biblioteca GEOS, obtive alguns resultados inesperados (consulte "dissolver com o QGIS fTools"). Parece que o GEOS não usa um limite para determinar se os polígonos estão tocando, conforme mencionado nestes problemas:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

A mesma abordagem no ArcGIS fornece o resultado esperado (consulte "dissolver com o ArcGIS 10.1").

Aparentemente, esse é um "recurso" do GEOS, e não um bug. Existe alguma maneira de corrigir os dados que eu tenho para produzir o resultado esperado? Uma pequena perda de precisão (alguns cm?) Pode ser aceitável para mim. Idealmente, a solução seria algo que eu poderia escrever em um plug-in QGIS, como uma etapa de pré-processamento.

Pergunta relacionada (sem respostas): Como definir o valor de tolerância da ferramenta de Geoprocessamento no QGIS?

Link para dados de amostra como um shapefile: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

dissolver polígonos v.dissolve

Snorfalorpagus
fonte
Uma solução alternativa seria primeiro aumentar e depois diminuir o polígono dissolvido no fTools (primeiro armazenando um buffer positivo e depois negativo).
Jake
Eu tentei isso, mas acabo com outros problemas (por exemplo, i.stack.imgur.com/LnFJy.png ). Aqui, a área azul é criada quando eu buffer / dissolve / buffer negativo, onde não deveria estar. Isso não é muito melhor do que o problema original. Não consigo ver como recuperar o canto "afiado" original.
Snorfalorpagus

Respostas:

14

Nesse caso, parece que você precisa ajudar a ferramenta de dissolução, corrigindo primeiro a topologia. Veja como você pode fazer isso no GRASS.

Quando você carrega o shapefile, é assim que o GRASS o vê:

Cada cruz marca uma área. Você pode ver que existem algumas cruzamentos nas linhas de limite: Estes são os polígonos da fita causados ​​pelo ligeiro deslocamento entre as linhas de limite.

  1. Remova os polígonos da tira formados pelas lacunas entre os polígonos reais:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Encaixe as linhas de limite:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Quebre as linhas de limite nas novas interseções:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Remova as linhas de limite agora duplicadas:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Dissolver os polígonos

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:

Jake
fonte
Obrigado @Jake. Esta é uma resposta muito clara. Infelizmente, quando tento aplicar o processo ao meu conjunto de dados inteiro (cobrindo 2500 km2), recebo um erro da ferramenta de snap "ERRO: G_realloc: não é possível alocar 144720024 bytes de memória no snap.c: 186". Acho que vou ter que dividir em pedaços menores. Isso deve ser bom, pois já estou dividindo em quadrados de 0,25 km2 para acelerar interseções / indexação espacial (este é o campo "ID" nos dados de amostra).
Snorfalorpagus
7

Use o comando GRASS GIS v.dissolve (no plugin Sextante -> Comandos GRASS -> Vetor)

Se eu rapidamente reproduzir o seu exemplo: insira a descrição da imagem aqui

O resultado com v.dissolve:

insira a descrição da imagem aqui

Explicação

O problema é fácil de entender. Um shapefile não tem topologia, se duas áreas compartilharem uma borda comum, essa borda seria digitalizada duas vezes e também armazenada em duplicata.

Você vê isso claramente quando tenta editar o shapefile:

insira a descrição da imagem aqui

GRIS GIS (como ArcGIS) é um GIS topológico. Quando você importa o shapefile no GRASS, a camada resultante possui uma topologia: a borda comum entre duas áreas existe uma vez e é compartilhada.

insira a descrição da imagem aqui

Por esse motivo, quando você quiser dissolver um arquivo de forma ( dissolver dois limites ), poderá encontrar problemas (no QGIS, GvSIG, OpenJUMP ou no antigo ArcView 3.x), consulte ArcUserI: Entendendo a topologia e os arquivos de forma .

No GRASS, v.dissolve é projetado para dissolver limites comuns entre áreas com o mesmo número de categoria

gene
fonte
1
Meu palpite é que este é um problema numérico, e me pergunto se sua cópia muito boa da geometria do OP capturaria as mesmas propriedades numéricas.
Chau
@ Chau: v.dissolvepossui um parâmetro de tolerância, que soluciona o problema do OP.
Jake
Esse detalhe deve ser incorporada a resposta acima, obrigado por esclarecer :)
Chau
Adicionei um link para os dados originais como um shapefile na pergunta. Quando uso v.dissolve, parece funcionar, exceto que "preenche" o pequeno quadrado no meio dos recursos. i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Eu proponho uma explicação
gene