Як дізнатися, чи є у багатокутника дірку, використовуючи калькулятор поля в ArcGIS


10

Деякі сторонні програми не можуть обробляти багатокутники з отворами (багатокутники з пончиками). Щоб знайти їх, я завжди використовую калькулятор поля ArcView 3, оскільки:

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

проте коли я намагаюся зробити це в ArcGIS, я отримую таке:

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

Тож питання в тому, як зробити це правильно в ArcGIS.


Я був здивований, що часткова робота не працювала так, як очікувалося, тому я трохи викопав. Виявляється, що, мабуть, пончики іноді (?) Можуть бути окремими частинами із внутрішніми кільцями - див. Речення / графіку перед останнім блоком коду на цій сторінці . Я також побачив нитку про сценарій, який би виявляв їх у python, але не в польовому калькуляторі.
Кріс Ш

Я можу це зробити за допомогою блоку коду, але це некрасиво. Основні лінії prt = shp.getPart (0) feat = arcpy.Polygon (prt). Досить обчислити feat.area та порівняти його з shp.area
FelixIP

Пов'язаний ресурс: gis.stackexchange.com/questions/27255 Рішення щодо порівняння вашої області може бути некрасивим, але, здається, воно працює і в Field Calculator. Можливо, варто відповісти як відповідь.
Chris W

Я вважаю за краще надати кредити @Hornbydd, тому що його відповідь порівнює цілі числа, моя власна (яку я давно знав) має справу з парними
FelixIP

Відповіді:


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!)

Дякую за елегантну відповідь. Той, який я використовував у відсутності ArcView 3, був менш надійним, дивіться мої коментарі до @ChrisW
FelixIP

1

Ви маєте на увазі різницю між двома виразами? Якщо так, то, схоже, що в нижній частині використовується Python як аналізатор, де як вгорі використовується VB. Щоб змінити це у вікні калькулятора поля в ArcGIS, просто виберіть VB замість Python, і верхній вираз повинен працювати.


Який вираз у VB будь ласка
FelixIP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.