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)
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)
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)
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)
Comments