So ermitteln Sie mithilfe des Feldrechners in ArcGIS, ob ein Polygon ein Loch hat

10

Einige Softwareprogramme von Drittanbietern können keine Polygone mit Löchern (Donut-Polygone) verarbeiten. Um sie zu finden, verwende ich immer den ArcView 3-Feldrechner, weil:

Geben Sie hier die Bildbeschreibung ein

Wenn ich dies jedoch in ArcGIS versuche, wird Folgendes angezeigt:

Geben Sie hier die Bildbeschreibung ein

Die Frage ist also, wie man es in ArcGIS richtig macht.

FelixIP
quelle
Ich war überrascht, dass partcount nicht wie erwartet funktionierte, also grub ich ein bisschen. Es stellt sich heraus, dass Donuts anscheinend manchmal (?) Einteilige Merkmale mit inneren Ringen sein können - siehe Satz / Grafik vor dem letzten Codeblock auf dieser Seite . Ich habe auch einen Thread über ein Skript gesehen, das sie in Python erkennt, aber nicht im Feldrechner.
Chris W
Ich kann es mit einem Codeblock machen, aber es ist hässlich. Hauptzeilen prt = shp.getPart (0) feat = arcpy.Polygon (prt). Es reicht aus, feat.area zu berechnen und mit shp.area zu vergleichen
FelixIP
Verwandte Ressource: gis.stackexchange.com/questions/27255 Ihre Bereichsvergleichslösung ist zwar hässlich, scheint aber zu funktionieren und im Feldrechner. Könnte es wert sein, als Antwort veröffentlicht zu werden.
Chris W
Ich würde lieber @Hornbydd Credits geben, weil seine Antwort ganze Zahlen vergleicht, meine eigene (die ich vor langer Zeit kannte) befasst sich mit Doppel
FelixIP

Antworten:

19

Die Anzahl der Teile ergibt nicht die richtige Antwort . Sie könnten ein mehrteiliges Polygon ohne Löcher haben. Siehe Bild unten für das Szenario.

Mehrteilige Polygone

Dies wäre eine einfache Abfrage vor ArcGIS 10 gewesen, da Sie ArcObjects hätten aufrufen können, um zu fragen, ob das Polygon ein Loch hat, aber ESRI hat einen Großteil dieser Unterstützung in der VBScripting-Umgebung so weit entfernt, dass es jetzt ziemlich nutzlos ist, was wirklich schade ist ...

Wie auch immer, Sie können diese Frage mit etwas Python lösen:

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

In das Ausdrucksfeld würden Sie Folgendes einfügen:

hasHole(!Shape!)
Hornbydd
quelle
Danke für die elegante Antwort. Die, die ich in Abwesenheit von ArcView 3 verwendet habe, war weniger zuverlässig, siehe meine Kommentare zu @ChrisW
FelixIP
1

Beziehen Sie sich auf den Unterschied zwischen den beiden Ausdrücken? Wenn ja, sieht es so aus, als würde der untere Python als Parser verwenden, während der obere VB verwendet. Um dies im Feldrechnerfenster in ArcGIS zu ändern, wählen Sie einfach VB anstelle von Python aus, und der obere Ausdruck sollte funktionieren.

gistech007
quelle
Was ist der Ausdruck in VB bitte
FelixIP