Как определить, есть ли у полигона дыра, с помощью полевого калькулятора в ArcGIS

10

Некоторые сторонние программы не могут обрабатывать полигоны с отверстиями (кольцевые полигоны). Чтобы найти их, я всегда использую полевой калькулятор ArcView 3, потому что:

введите описание изображения здесь

Однако, когда я пытаюсь сделать это в ArcGIS, я получаю это:

введите описание изображения здесь

Так что вопрос в том, как сделать это правильно в ArcGIS.

FelixIP
источник
Я был удивлен, что парткарта не сработала, как ожидалось, поэтому я немного покопался. Оказывается, что, очевидно, пончики иногда (?) Могут быть отдельными деталями с внутренними кольцами - см. Предложение / рисунок перед последним блоком кода на этой странице . Я также видел поток о скрипте, который обнаружил бы их в python, но не в полевом калькуляторе.
Крис W
Я могу сделать это с помощью блока кода, но это некрасиво. Основные линии prt = shp.getPart (0) feat = arcpy.Polygon (prt). Достаточно рассчитать feat.area и сравнить его с shp.area
FelixIP
Связанный ресурс: gis.stackexchange.com/questions/27255 Ваше решение для сравнения областей может быть уродливым, но, похоже, оно работает и в Field Calculator. Может быть стоит опубликовать в качестве ответа.
Крис W
Я бы лучше дал кредит @Hornbydd, потому что его ответ сравнивает целые числа, мой собственный (который я знал давно) имеет дело с
двойными числами

Ответы:

19

Количество деталей не даст правильного ответа . Вы можете иметь многочастный многоугольник без отверстий. Смотрите изображение ниже для сценария.

Многокомпонентные полигоны

Это был бы простой запрос до ArcGIS 10, так как вы могли бы вызвать ArcObjects, чтобы спросить, есть ли у полигона дыра, но ESRI удалил большую часть этой поддержки в среде VBScripting до такой степени, что теперь она довольно бесполезна, правда, немного стыдно ...

В любом случае вы можете решить этот вопрос с помощью Python:

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

В поле выражения вы должны поместить следующее:

hasHole(!Shape!)
Hornbydd
источник
Спасибо за элегантный ответ. Тот, который я использовал в отсутствие ArcView 3, был менее надежным, см. Мои комментарии к @ChrisW
FelixIP
1

Вы имеете в виду разницу между двумя выражениями? Если да, похоже, что нижний использует Python в качестве парсера, а верхний использует VB. Чтобы изменить это в окне Field Calculator в ArcGIS, просто выберите VB вместо Python, и верхнее выражение должно работать.

gistech007
источник
Какое выражение в VB пожалуйста
FelixIP