Como descobrir se o polígono possui um furo usando a calculadora de campo no ArcGIS

10

Alguns softwares de terceiros não podem manipular polígonos com orifícios (polígonos de rosca). Para encontrá-los, eu sempre uso a calculadora de campo ArcView 3, porque:

insira a descrição da imagem aqui

no entanto, quando tento fazer isso no ArcGIS, recebo o seguinte:

insira a descrição da imagem aqui

Portanto, a questão é como corrigi-lo no ArcGIS.

FelixIP
fonte
Fiquei surpreso porque o número de funcionários não funcionou como o esperado, então fiz algumas escavações. Acontece que, aparentemente, os anéis de rosca às vezes (?) Podem ser elementos de peça única com anéis internos - veja a frase / gráfico antes do último bloco de código nesta página . Eu também vi um tópico sobre um script que os detectaria em python, mas não na calculadora de campo.
11384 Chris W
Eu posso fazer isso usando um bloco de código, mas é feio. Linhas principais prt = shp.getPart (0) feat = arcpy.Polygon (prt). É o suficiente para feat.area calcular e comparar com shp.area
FelixIP
Recurso relacionado: gis.stackexchange.com/questions/27255 Sua solução de comparação de áreas pode ser feia, mas parece que funciona e dentro da Calculadora de Campo. Pode valer a pena postar como resposta.
11385 Chris W no dia
Eu prefiro dar créditos para @Hornbydd, porque sua resposta compara inteiros, minha própria (que eu conhecia há muito tempo) lida com duplas
FelixIP

Respostas:

19

A contagem de peças não produzirá a resposta correta . Você poderia ter um polígono de várias partes sem furos. Veja a imagem abaixo para o cenário.

Polígonos de várias partes

Esta teria sido uma consulta simples antes do ArcGIS 10, como você poderia ter chamado o ArcObjects para perguntar se o polígono tinha um buraco, mas a ESRI removeu grande parte desse suporte no ambiente do VBScripting a ponto de ser bastante inútil agora, uma pena realmente ...

De qualquer forma, você pode resolver esta questão com alguns Python:

def hasHole(geom):
  parts = geom.partCount
  boundaries = geom.boundary().partCount
  if boundaries > parts:
    return 1
  else:
    return 0

Na caixa de expressão, você colocaria o seguinte:

hasHole(!Shape!)
Hornbydd
fonte
Obrigado pela resposta elegante. O que eu usei na ausência de ArcView 3 era menos confiável, ver meus comentários para @ChrisW
FelixIP
1

Você está se referindo à diferença entre as duas expressões? Se sim, parece que o inferior está usando Python como o analisador, enquanto o superior está usando VB. Para alterar isso na janela Calculadora de campo no ArcGIS, basta selecionar VB em vez de Python e a expressão superior deve funcionar.

gistech007
fonte
Qual é a expressão em VB, por favor
FelixIP