Jak sprawdzić, czy wielokąt ma dziurę za pomocą kalkulatora pola w ArcGIS

10

Niektóre programy innych firm nie obsługują wielokątów z dziurami (wielokąty pierścieniowe). Aby je znaleźć, zawsze używam kalkulatora pola ArcView 3, ponieważ:

wprowadź opis zdjęcia tutaj

jednak gdy próbuję to zrobić w ArcGIS, otrzymuję to:

wprowadź opis zdjęcia tutaj

Pytanie brzmi, jak to zrobić w ArcGIS.

FelixIP
źródło
Byłem zaskoczony, że partcount nie działał zgodnie z oczekiwaniami, więc zacząłem kopać. Okazuje się, że pozornie pączki mogą czasami (?) Być elementami pojedynczymi z pierścieniami wewnętrznymi - zobacz zdanie / grafikę przed ostatnim blokiem kodu na tej stronie . Widziałem też wątek o skrypcie, który wykrywa je w pythonie, ale nie w kalkulatorze polowym.
Chris W
Mogę to zrobić za pomocą bloku kodu, ale jest brzydka. Główne linie prt = shp.getPart (0) feat = arcpy.Polygon (prt). Wystarczy obliczyć feat.area i porównać ją z shp.area
FelixIP
Powiązany zasób: gis.stackexchange.com/questions/27255 Twoje rozwiązanie do porównywania obszarów może być brzydkie, ale wydaje się, że działa i działa w obrębie kalkulatora pola. Być może warto opublikować jako odpowiedź.
Chris W
Wolę przypisywać kredyty @ Horbyddowi, ponieważ jego odpowiedź porównuje liczby całkowite, moje własne (które znałem dawno temu) dotyczą podwójnych
FelixIP

Odpowiedzi:

19

Liczba części nie da poprawnej odpowiedzi . Możesz mieć wieloczęściowy wielokąt bez otworów. Zobacz poniższy scenariusz.

Wieloczęściowe wielokąty

Byłoby to proste zapytanie sprzed ArcGIS 10, ponieważ można było wywołać ArcObjects, aby zapytać, czy wielokąt ma dziurę, ale ESRI usunął wiele z tego wsparcia w środowisku VBScripting do tego stopnia, że ​​jest teraz całkiem bezużyteczne, naprawdę wstyd ...

W każdym razie możesz rozwiązać to pytanie za pomocą jakiegoś Pythona:

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

W polu wyrażenia umieścisz następujące elementy:

hasHole(!Shape!)
Hornbydd
źródło
Dzięki za elegancką odpowiedź. Ten, którego użyłem przy braku ArcView 3, był mniej niezawodny, patrz moje komentarze do @ChrisW
FelixIP
1

Czy odnosisz się do różnicy między tymi dwoma wyrażeniami? Jeśli tak, wygląda na to, że dolny używa Pythona jako parsera, podczas gdy ten na górze używa VB. Aby to zmienić w oknie Kalkulatora pola w ArcGIS, wystarczy wybrać VB zamiast Python, a górne wyrażenie powinno działać.

gistech007
źródło
Jakie jest wyrażenie w VB, proszę
FelixIP