Come scoprire se il poligono ha un buco usando il calcolatore di campo in ArcGIS


10

Alcuni software di terze parti non sono in grado di gestire poligoni con buchi (poligoni a ciambella). Per trovarli uso sempre il calcolatore di campo ArcView 3, perché:

inserisci qui la descrizione dell'immagine

tuttavia quando provo a farlo in ArcGIS, ottengo questo:

inserisci qui la descrizione dell'immagine

Quindi la domanda è come farlo bene in ArcGIS.


Sono stato sorpreso che il conteggio parziale non abbia funzionato come previsto, quindi ho scavato. Si scopre che apparentemente le ciambelle a volte (?) Possono essere caratteristiche di parti singole con anelli interni - vedere la frase / la grafica prima dell'ultimo blocco di codice in questa pagina . Ho anche visto un thread su uno script che li avrebbe rilevati in Python, ma non nel calcolatore di campo.
Chris W,

Posso farlo usando un blocco di codice, ma è brutto. Linee principali prt = shp.getPart (0) feat = arcpy.Polygon (prt). Basta calcolare feat.area e confrontarlo con shp.area
FelixIP

Risorsa correlata: gis.stackexchange.com/questions/27255 La soluzione di confronto delle aree potrebbe essere brutta, ma sembra che funzioni e all'interno di Field Calculator. Potrebbe valere la pena pubblicare come risposta.
Chris W,

Preferirei dare credito a @Hornbydd, perché la sua risposta confronta i numeri interi, la mia (che conoscevo molto tempo fa) si occupa dei doppi
FelixIP

Risposte:


19

Il conteggio delle parti non produrrà la risposta corretta . Potresti avere un poligono in più parti senza buchi. Vedi l'immagine sotto per lo scenario.

Poligoni in più parti

Questa sarebbe stata una semplice query pre-ArcGIS 10 come avresti potuto chiamare ArcObjects per chiedere se il poligono avesse un buco ma ESRI ha rimosso gran parte di questo supporto nell'ambiente VBScript al punto che ora è abbastanza inutile, un po 'un peccato davvero ...

Ad ogni modo puoi risolvere questa domanda con alcuni Python:

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

Nella casella dell'espressione inserire quanto segue:

hasHole(!Shape!)

Grazie per la risposta elegante. Quello che ho usato in assenza di ArcView 3 era meno affidabile, vedi i miei commenti a @ChrisW
FelixIP

1

Ti riferisci alla differenza tra le due espressioni? Se sì, sembra che quello in basso stia usando Python come parser, mentre quello in alto sta usando VB. Per cambiarlo nella finestra Field Calculator in ArcGIS, basta selezionare VB invece di Python e l'espressione superiore dovrebbe funzionare.


Qual è l'espressione in VB per favore
FelixIP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.