Cómo encontrar si el polígono tiene un agujero usando la calculadora de campo en ArcGIS

10

Algunos programas de terceros no pueden manejar polígonos con agujeros (polígonos de rosquilla). Para encontrarlos, siempre uso la calculadora de campo ArcView 3 porque:

ingrese la descripción de la imagen aquí

sin embargo, cuando trato de hacer esto en ArcGIS, obtengo esto:

ingrese la descripción de la imagen aquí

Entonces, la pregunta es cómo hacerlo bien en ArcGIS.

FelixIP
fuente
Me sorprendió que el recuento no funcionara como se esperaba, así que investigué un poco. Resulta que, aparentemente, las rosquillas a veces pueden ser (?) Características de una sola parte con anillos internos : vea la oración / gráfico antes del último bloque de código en esta página . También vi un hilo sobre un script que los detectaría en Python, pero no en la calculadora de campo.
Chris W
Puedo hacerlo usando un bloque de código, pero es feo. Líneas principales prt = shp.getPart (0) feat = arcpy.Polygon (prt). Es suficiente calcular feat.area y compararlo con shp.area
FelixIP
Recurso relacionado: gis.stackexchange.com/questions/27255 Su solución de comparación de áreas puede ser fea, pero parece que funciona y está dentro de la Calculadora de campo. Puede valer la pena publicarlo como respuesta.
Chris W
Prefiero darle créditos a @Hornbydd, porque su respuesta compara números enteros, mi propio (que sabía hace mucho tiempo) trata de dobles
FelixIP

Respuestas:

19

El recuento de partes no dará la respuesta correcta . Podría tener un polígono de varias partes sin agujeros. Vea la imagen a continuación para ver el escenario.

Polígonos de varias partes

Esta habría sido una simple consulta previa a ArcGIS 10, ya que podría haber llamado ArcObjects para preguntar si el polígono tenía un agujero, pero ESRI ha eliminado gran parte de este soporte en el entorno de VBScripting hasta el punto que es bastante inútil ahora, realmente es una pena ...

De todos modos, puedes resolver esta pregunta con Python:

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

En el cuadro de expresión colocarías lo siguiente:

hasHole(!Shape!)
Hornbydd
fuente
Gracias por la elegante respuesta. El que usé en ausencia de ArcView 3 era menos confiable, vea mis comentarios a @ChrisW
FelixIP
1

¿Te refieres a la diferencia entre las dos expresiones? En caso afirmativo, parece que el de abajo está usando Python como el analizador, mientras que el de arriba está usando VB. Para cambiar esto en la ventana de la Calculadora de campo en ArcGIS, simplemente seleccione VB en lugar de Python y la expresión superior debería funcionar.

gistech007
fuente
¿Cuál es la expresión en VB por favor
FelixIP