Comment savoir si un polygone a un trou à l'aide de la calculatrice de champ dans ArcGIS

10

Certains logiciels tiers ne peuvent pas gérer les polygones avec des trous (polygones beignets). Pour les trouver, j'utilise toujours la calculatrice de terrain ArcView 3, car:

entrez la description de l'image ici

cependant quand j'essaye de faire ceci dans ArcGIS, j'obtiens ceci:

entrez la description de l'image ici

La question est donc de savoir comment le faire correctement dans ArcGIS.

FelixIP
la source
J'ai été surpris que le décompte ne fonctionne pas comme prévu, alors j'ai creusé. Il s'avère que, apparemment, les beignets peuvent parfois (?) Être des éléments monoblocs avec des anneaux intérieurs - voir la phrase / le graphique avant le dernier bloc de code sur cette page . J'ai également vu un fil sur un script qui les détecterait en python, mais pas dans la calculatrice de terrain.
Chris W
Je peux le faire en utilisant un bloc de code, mais c'est moche. Lignes principales prt = shp.getPart (0) feat = arcpy.Polygon (prt). Il suffit de calculer feat.area et de le comparer à shp.area
FelixIP
Ressource connexe: gis.stackexchange.com/questions/27255 Votre solution de comparaison de zone peut être moche, mais il semble que cela fonctionne et dans Field Calculator. Cela pourrait valoir la peine d'être publié comme réponse.
Chris W
Je préfère donner des crédits à @Hornbydd, car sa réponse compare des nombres entiers, le mien (que je connaissais depuis longtemps) traite du double
FelixIP

Réponses:

19

Le décompte des pièces ne donnera pas la bonne réponse . Vous pourriez avoir un polygone en plusieurs parties sans trous. Voir l'image ci-dessous pour le scénario.

Polygones en plusieurs parties

Cela aurait été une simple requête pré-ArcGIS 10 car vous auriez pu appeler ArcObjects pour demander si le polygone avait un trou mais ESRI a supprimé une grande partie de ce support dans l'environnement VBScripting au point que c'est assez inutile maintenant, un peu dommage vraiment ...

Quoi qu'il en soit, vous pouvez résoudre cette question avec du Python:

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

Dans la zone d'expression, vous placez les éléments suivants:

hasHole(!Shape!)
Hornbydd
la source
Merci pour la réponse élégante. Celui que j'ai utilisé en l'absence d'ArcView 3 était moins fiable, voir mes commentaires à @ChrisW
FelixIP
1

Faites-vous référence à la différence entre les deux expressions? Si oui, il semble que celui du bas utilise Python comme analyseur alors que celui du haut utilise VB. Pour changer cela dans la fenêtre Field Calculator dans ArcGIS, sélectionnez simplement VB au lieu de Python et l'expression du haut devrait fonctionner.

gistech007
la source
Quelle est l'expression en VB s'il vous plaît
FelixIP