Simplificando polígonos adjacentes usando a ferramenta QGIS Simplify Geometries

10

Eu tenho um Shapefile grande com 200.000 polígonos, mas o arquivo é muito grande para o aplicativo que o usará. Eu gostaria de generalizar esses polígonos e criar um arquivo muito menor.

Eu tentei fazer isso no QGIS usando a ferramenta "Simplify Geometries". Eu tentei isso em uma parte muito pequena do meu Shapefile e estou feliz com os resultados, mas tenho um pequeno problema que não sei como resolver. Anexei a imagem para mostrar o problema.

Limites BRANCOS são limites antes da simplificação. Os limites do RED estão após a simplificação. As áreas problemáticas são circuladas com a cor laranja. Como você pode ver, os "limites simplificados" contêm algumas áreas que após a simplificação não pertencem a nenhum dos polígonos anteriores.

Como simplifico este Shapefile e mantenho limites comuns entre polígonos como uma única linha e elimino áreas que foram criadas após a simplificação?

Polígonos simplificados no QGIS

INFORMAÇÃO ADICIONAL:

Depois de seguir as instruções sugeridas

  1. Converter polígonos em linhas
  2. Simplifique linhas
  3. Converter linhas novamente em polígonos

Eu recebo os seguintes resultados. Está um pouco melhor do que antes, mas ainda assim recebo áreas fora dos polígonos originais (consulte as áreas brancas na figura abaixo).

@ Andrew sugeriu que eu associasse cada linha ao polígono adjacente, mas não sei como fazê-lo no QGIS.

insira a descrição da imagem aqui

Ainda estou tentando concluir o processo de simplificação de polígonos. Segui as instruções sugeridas neste post e, quando achei que tinha resultados aceitáveis, mais um problema apareceu. Abaixo está o resumo do que fiz com imagens de resultados. Todas as etapas foram executadas usando a caixa de ferramentas PROCESSING no QGIS.

  1. Primeiro, converti polígonos em linhas
  2. Segundo, limpei as linhas usando v.clean com a opção break. Isso resultou em CAMADA LIMPADA DE VETOR e CAMADA DE ERRO. Camada de erro (pontos verdes na imagem fornecida) possui um ponto verde em cada interseção de linha. Eu não sei o que isso significa.
  3. Terceiro, simplifiquei as linhas usando a ferramenta "SIMPLIFY GEOMETRY" (resultam em linhas vermelhas nas imagens). Comparando linhas vermelhas simplificadas e linhas laranja originais, estou feliz com o resultado.
  4. Quarto, eu queria converter linhas de volta para polígonos usando a ferramenta "Poligonizar" em "PROCESSAMENTO" e obtive resultados que eu não esperava (segunda imagem com polígonos sombreados de cor verde-oliva escura). Parece que as interseções da camada de erro conectadas pelo polígono e criaram conjuntos de polígonos completamente diferentes, ignorando as linhas simplificadas.

Alguém poderia explicar o que deu errado aqui?

Por que linhas simplificadas vermelhas não foram convertidas corretamente em polígonos simplificados?

Como você pode ver, não sou especialista em GIS, mas preciso fazer isso sozinho. Não sei se estou muito longe da solução, mas é frustrante poder ver linhas simplificadas que achei aceitáveis ​​para o que gostaria de fazer, mas não posso convertê-las em polígonos.

Aqui estão duas imagens com resultados das duas últimas etapas do processo:

Linhas simplificadas e linhas originais

Resultados das linhas simplificadas pligonizadas

David
fonte
@nhopton Na página do Polygonizer plugins.qgis.org/plugins/Polygonizer, ele diz que "Cria polígonos a partir de linhas que se cruzam". Isso sugere que polígonos serão criados sempre que houver uma interseção de linha (mas talvez minha interpretação esteja errada). O que eu preciso é me livrar dessas lacunas que foram criadas ao usar a ferramenta "simplificar geometrias" e se o Polygonizer puder fazer isso, eu ficaria muito contente.
David David
Pensando nisso, sua camada poligonal original deve simplificar sem problemas. Se não estiver fazendo isso, acho que provavelmente significa que você tem polígonos ruins nos dados originais. Polígonos que se sobrepõem ligeiramente ou que possuem pequenos espaços entre eles. Tente ampliar as áreas problemáticas para ver se consegue encontrar algo assim. N
nhopton 22/01
Uma boa maneira de preservar a topologia consiste no fluxo de trabalho sugerido por @radouxju (exceto o cálculo do centróide que não é necessário) e representado no modelo de processamento na minha resposta. Como alternativa, acho que o GRASS v.generalizeé outra ótima opção. Espero que isto ajude.
Antonio Falciano 23/01
Pergunta relacionada: gis.stackexchange.com/questions/20799/…
simon04

Respostas:

7

Eu obtive um bom resultado usando o GRASS v.generalize na Processing Toolbox usando valores padrão:

insira a descrição da imagem aqui

Algumas linhas permanecem intocadas.

AndreJ
fonte
Teve um bom sucesso com esse método depois de definir a tolerância de snap v.in.ogr de -1 (sem snap) a 0,00001, conforme sugerido por @Kantan.
Cm1
4

Eu entrei nesse problema com o Qgis2.16, mas não consegui que o GRASS desse um resultado topologicamente correto como @AndreJ.

Uma boa solução é alterar a tolerância de snap ao v.in.ogr nos parâmetros avançados da ferramenta v.generalize.simplify . O padrão é -1, o que impede o snap no GRASS.

Ao colocar um pequeno valor aqui (como 1e-05 m), o snap é ativado e o GRASS reconhece as bordas compartilhadas dos polígonos. A simplificação fornece uma camada topologicamente correta, sem furos.

Nota: Ao definir a tolerância de snap a valores mais altos, é possível alterar os polígonos para que os mais finos possam ser excluídos, se você desejar. Siga essa operação com v.clean usando rmarea e um limite grande o suficiente para excluir as sobras pequenas, e pronto!

Kantan
fonte
3

primeiro converta seu polígono em linhas

use v.clean para limpar sua topologia (com a opção "break")

então você simplifica suas linhas

Finalmente, você volta suas linhas para polígonos. (Usando polygonize)

EDIT: Para obter os atributos de seus polígonos, a melhor maneira, se você não tiver polígonos com várias partes no conjunto de dados original , é obter os centróides antigos e dos polígonos simplificados e juntá-los com base na localização mais próxima (os centróides devem não se mova muito se você modificar levemente seus limites)

radouxju
fonte
1
Parece-me que você omitiu algumas etapas, embora o fluxo de trabalho possa funcionar no final. Ao converter os polígonos em linhas, pode ser necessário associá-la a todos os polígonos adjacentes. Depois da simplificação, é necessário transformar as linhas novamente em polígonos de várias partes. Se os polígonos originais forem convexos, você poderá combinar o original com o simplificado usando o centróide (por exemplo, se o centróide do original estiver contido no poli simplificado, é uma correspondência). Se não forem convexas, será muito mais difícil.
Andy W
Olá, segui o procedimento sugerido por radouxju, mas ainda recebo partes do polígono original fora de seus limites originais. Como associo a linha a todos os polígonos adjacentes no QGIS? Estou planejando usar esses polígonos nos aplicativos Web e preciso reduzir o número de nós para um carregamento mais rápido. O que recebo agora é uma boa redução, mas não consigo me livrar dessas pequenas áreas que existem após a simplificação. Todas as idéias para resolver isso serão muito apreciadas.
David
@David. Eu acho que seu problema pode estar na Etapa 3, linhas para polígonos. No Processing Toolkit, existe uma ferramenta chamada "Polygonize" e eu tentaria isso. Eu acho que isso ainda precisa que os pacotes Shapely e Numpy sejam instalados. Dito isto, não consigo "Polygonize" trabalhar para mim no QGIS-Master no momento. N
nhopton 22/01
2

Você pode resolver o problema com um modelo de processamento (ex-SEXTANTE) como este:

insira a descrição da imagem aqui

Versão do script:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Nota: a única restrição é que o campo comum deve estar IDdentro Join attributes table, porque é o único campo da saída de Lines to polygons. É por isso que o campo comum não é uma entrada variável do modelo. Portanto, um IDcampo deve estar disponível na camada de polígono de entrada.

Antonio Falciano
fonte