Більше

Ітерація Intersect_analysis над багатокутним шейп -файлом за допомогою ArcPy?

Ітерація Intersect_analysis над багатокутним шейп -файлом за допомогою ArcPy?


Я використовую ArcGIS 10.3.1 для робочого столу, і у мене є два шейп -файли:

  1. Набір потокових даних (векторної лінії)
  2. Сітка з багатокутників

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

Код:

імпортувати arcpy #встановити деякі змінні середовища arcpy.env.workspace = "C:  Users  Alex  Documents  SoilMoisture" arcpy.env.overwriteOutput = 1 #визначити змінні для всіх необхідних класів об'єктів та полів потоки = "pathto/str_split_lamb.shp "## шейп-файл потокової мережі, розділений у вершинах, у проекції Ламберта, з полем значення довжини, попередньо розрахованим rainGrid =" pathto/net_test.shp "## полігонами для дощових осередків, з порожнім курсором поля" DRN_LENGTH "= arcpy.UpdateCursor ( rainGrid) ## буде повторювати кожен рядок функції сітки опадів для рядка в курсорі: intStreams = arcpy.Intersect_analysis ([потоки, rainGrid], "output.shp", "ALL", "", "LINE") ## intStreams стає усіма сегментами потоку всередині багатокутника strCursor = arcpy.SearchCursor (intStreams) ## ітерація по потоках у перетині totalLen = 0 для rowmore у strCursor: totalLen += rowmore.length ## підсумовує всі значення довжини в одну змінну друку totalLen #це просто тут, щоб перевірити, що відбувається. DRN_LENGTH = totalLen ## додати значення до fi eld cursor.updateRow (рядок) друк "Готово!"

Якісь ідеї?


Вам потрібно спочатку вибрати один полігон з кожною ітерацією; тоді інструмент перетину буде розглядати лише один багатокутник. Ви можете вибрати за атрибутом (http://pro.arcgis.com/en/pro-app/tool-reference/data-management/select-layer-by-attribute.htm), використовуючи унікальні FID.


Вам взагалі не слід повторювати будь -які виділення SQL, оскільки це дуже повільно і абсолютно непотрібно. Замість того, щоб перетинати всі лінії всіма багатокутниками, потім скористайтеся курсором пошуку на результатах перетину, щоб побудувати словник з полігоном FID як ключем словника зі значеннями, які містять суми довжин рядків. Нарешті, використовуйте курсор оновлення для запису до кожного багатокутника після пошуку ключа словника FID полігону. Після завершення перетину фактичний процес узагальнення даних перетину для повної сітки та запису довжин до цільового набору даних завершиться за секунди для 10 000 записів.

Дивіться мій блог про маніпулювання даними Turbo Charging Data за допомогою курсорів Python та словників. Зокрема, подивіться розділ «Використання словника Python, створеного за допомогою da SearchCursor для заміни підсумкової таблиці результатів статистики» в кінці блогу.


Виходячи з відповіді @Paulo Raposo, якщо сценарій буде запускатися за межами вікна Python в ArcMap, а шар відсутній на поточній карті, вам доведеться скористатися методом Make Feature Layer перед виконанням вибору об’єкта за допомогою Select Layer by Attribute.


Подивіться відео: How to do Dissolve. Union. Intersect. Merge in Arc GIS Geo processing