• João Ataide

Simplificação de polígonos com Arcpy

Atualizado: 21 de jun.


 

Trazendo mais um artigo nas linhas anteriores, hoje falarei sobre simplificação de polígonos. Essas funções são muito importantes, tanto nos ajustes de máscaras para treinamento, quanto no pós-processamento dos resultados criados pelos modelos, como simplificação e ajuste da delimitação detectadas de telhados. Aqui vou usar as mesmas imagens e áreas usadas anteriormente, mas, dessa vez importaremos o módulo cartography do arcpy.


# Importar bibliotecas
 import arcpy 
 from arcpy.sa import *
 import arcpy.cartography as CA

# Configurar ambiente
workspace = r'D:\\Projeto\\simplify.gdb' 
basepath = r'D:\\Projeto\\dados'
imagespath = f'{basepath}\\imagens'

coords = "467321.538879395 7933874.64569092 481460.825317383 7949490.0112915"



Gerando máscaras e dados


Para gerar as máscaras, pegaremos a imagem recortada e usaremos um threshold para pegar as áreas no corpo d'água com a seleção de valores menores ou iguais a 76. Consertando depois esse resultado para escala de cinza e salvando temos o seguinte resultado.




outmask = f'{basepath}\\cond.tif'

cond = Con(rgb_cliped, 0, 255, "Value <= 76")
cond = Grayscale(cond)
cond.save(outmask)

cond







Aí é transformar em polígono, mas não usaremos a simplificação direta pela ferramenta, já que trataremos mais a frente.


outPolygons = f'{basepath}\\raster_polygon.shp'

arcpy.RasterToPolygon_conversion(outmask, outPolygons, "NO_SIMPLIFY", "VALUE")


Agora fazemos uma seleção somente dos dados referentes a área do corpo d'água e aquelas área de polígono maior que 1.2 M, chegando no seguinte resultado.




outselect1 = f"{workspace}\\polygon_Selected1"
outselect2 = f"{workspace}\\polygon_Selected2"

arcpy.analysis.Select(outPolygons, outselect1, "gridcode = 179 ")
arcpy.analysis.Select(outselect1, outselect2, "Shape_Area >= 1.200.000")


Simplificando os polígonos



Agora simplificar os polígonos é muito simples, porém, temos que tomar alguns cuidados. Para esse trabalho temos geralmente disponíveis os modelos de Douglas-Peucker, Wang-Müller, Zhou-Jones e Visvalingam-Whyatt e são esses que iremos executar e comparar aqui.




Como podemos observar na ilustração dos gatos acima, que cada simplificação tem suas vantagens e desvantagens, alguns vão preservar mais o formato e outros mais a área, mas, no final precisaremos testar todos para saber o que se encaixa melhor no seu projeto. Agora a primeira coisa é passar o nome dos arquivos que serão executados.


simplify1 = f"{workspace}\\polygon_DouglasPeucker"
simplify2 = f"{workspace}\\polygon_WangMuller"
simplify3 = f"{workspace}\\polygon_ZhouJones"
simplify4 = f"{workspace}\\polygon_VisvalingamWhyatt"


O primeiro é o Douglas-Peucker (Retenção de Pontos Críticos) é um método que retêm os pontos críticos, basicamente remove a redundância relativas e simplifica os vértices, esse método é indicado para escalas pequenas.


Tolerância: é a tolerância perpendicular máxima permitida entre vértices e as linhas criadas.


CA.SimplifyPolygon(outselect2, simplify1, "POINT_REMOVE", 500)

https://doi.org/10.3138/FM57-6770-U75U-7727





O Wang-Müller (Retenção de Curvas Críticas) identifica e elimina as curvas relativamente insignificantes e como o Douglas-Peucker também é indicado para escalas pequenas.


Tolerância: a tolerância nesse caso se dá pelo diâmetro de um círculo com aproximadamente a significância da curva.



CA.SimplifyPolygon(outselect2, simplify2,"BEND_SIMPLIFY", 500)

https://doi.org/10.1559/152304098782441750




O Zhou-Jones (Retenção de Áreas Efetivas Ponderadas) é um método muito utilizado que identifica triângulos buscando as áreas efetivas e pondera essas áreas e o vértices deles.


Tolerância: a tolerância da área em metro quadrado é dada pela área em um triângulo significativo com vértices adjacentes, onde, quanto maior o triângulo se desviar de ser equilátero, maior será o peso deste assim, menor será a possibilidade de ser removido.


CA.SimplifyPolygon(outselect2, simplify3,"WEIGHTED_AREA", 200)

https://doi.org/10.1007/3-540-26772-7_28




Por último o Visvalingam-Whyatt (Retenção de Áreas Efetivas Ponderadas) identifica também os triângulos efetivos, suas áreas e vértices e guia a remoção dos vértices, simplificando o contorno dos polígonos mantendo o máximo de características deles.


Tolerância: a tolerância da área em metro quadrado é dada a área do triângulo simplificado com três vértices adjacentes.


CA.SimplifyPolygon(outselect2, simplify4,"EFFECTIVE_AREA", 200)

https://doi.org/10.1179/000870493786962263