Більше

Тиражування інструменту зведеної статистики з полем регістру за допомогою власного обчислення в ModelBuilder?

Тиражування інструменту зведеної статистики з полем регістру за допомогою власного обчислення в ModelBuilder?


Я думав, що це буде простою проблемою для вирішення, оскільки мій гуглінг досі не дав відповідей.

Я створив таблицю поблизу (використовуючи "Створити таблицю поблизу" в дузі), порівнюючи два набори точок, і включив опцію отримання 10 найближчих точок для кожної з вхідних точок. Отже, для кожної з вхідних точок у мене є 10 функцій поблизу (це можна побачити у стовпці IN_FID).


Я хочу розрахувати середню відстань плюс середній кут (який я перетворив на підшипник 0-360) з 10 балів для кожного унікального значення в IN_FID. Я використовую інструмент зведеної статистики з полем справи, встановленим на IN_FID, щоб отримати середню відстань, однак, щоб отримати середній підшипник, мені потрібно виконати обчислення, яке враховує кругову статистику.

Наразі моє рішення в ModelBuilder полягає у використанні ітератора «Вибір рядків» із набором IN_FID як «Групувати за полем», після чого я запускаю поле обчислення на виході для мого середнього підшипника. Отже, для кожного унікального значення у стовпці IN_FID я маю один середній підшипник (від 10 балів). Однак цей процес є дуже повільним, він займає близько 3 секунд для кожного унікального IN_FID, і з 10 000 балів триває протягом 8 годин обробки.

Інструмент підсумкової статистики працює за лічені секунди, тому мені було цікаво, чи існує сценарій python, який я можу написати і запустити в блоці коду інструмента обчислення, це означає, що мені не потрібно використовувати ітератор «Вибір рядків» і пришвидшити цей процес? (проте, я навіть не впевнений, що це пришвидшить це!). На даний момент мій python не дуже багато, але моє дослідження змусило мене думати, що мені потрібно використовувати пошук або оновити курсор, а деякі (вкладені?) Для циклів, але я не маю знань, щоб застосовувати та писати це ще, але я вчусь на різних прикладах, які знаходжу в Інтернеті.

Хтось має приклади сценаріїв на python, які виконують подібне завдання, яке я міг би використати як основу для цього завдання, чи може вказати мені напрямок деяких корисних навчальних посібників?

Або у вас є якісь альтернативні способи подолання цієї проблеми, про які я не думав?


Ніколи не використовуйте вкладені цикли курсора. Ніколи! Поняття вкладених циклів курсору абсолютно непотрібне.

Використовуйте словник для збору інформації з курсору пошуку для кожного IN_FID як ключа. Пошук IN_FID зі словника відбувається фактично миттєво і повинен обробляти 10000 очок за 1 хвилину або менше.

Словники можна заповнити з курсору пошуку для виконання статистичних операцій, коли кожен запис читається, або спочатку можна зібрати всі значення, пов’язані з кожним ключем FID, у список у словнику, а потім використовувати цикл for для впорядкованих статистичних операцій після сортування списку. Ці процеси в пам'яті надзвичайно швидкі. Підсумкове значення або набори значень можна зберегти назад у словнику. Нарешті, ви пишете всі свої остаточні статистичні значення за допомогою курсору оновлення, який шукає кожен IN_FID зі словника, щоб отримати підсумкове значення, яке вам потрібно написати, або ви можете створити нову таблицю та заповнити її за допомогою вставного курсору.

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

Мені потрібно було б знати, який круговий статистичний процес ви робите зі своїми відстанями та кутами, щоб запропонувати модифікацію сценарію, яка відповідала б вашим точним потребам. Але я впевнений, що основний план сценарію - це те, що вам потрібно, і його можна змінити, щоб робити те, що ви хочете, і що це буде відповідати вашим очікуванням продуктивності.


Використовуючи посаду Річарда Ферхурта та цю посаду для середнього підшипника, я прийшов до наступного рішення:

import math import arcpy fc = "e: /NCCA/Temp/Temp.gdb/near_table" bearings = ["IN_FID", "bearing", "bearing_avg"] # створює словник з ключем IN_FID, а підшипник як значення valueDict = {} з arcpy.da.SearchCursor (fc, підшипники) як searchRows: для searchRow у searchRows: keyValue = searchRow [0], якщо не keyValue в valueDict: valueDict [keyValue] = [searchRow [1]] ще: valueDict [keyValue] .append (searchRow [1]) # обчислює середнє значення значень для кожного словникового ключа і поміщає середнє значення підшипника в новий словник averageBearingDict = {} для ключа в valueDict: cosSum = 0,0 sinSum = 0,0 для bearingVal у valueDict [ключ]: theCos = math.cos (math.radians (float (bearingVal))) theSin = math.sin (math.radians (float (bearingVal))) cosSum + = theCos sinSum + = theSin N = len ( valueDict [ключ]) C = cosSum / NS = sinSum / N theMean = math.atan2 (S, C), якщо theMean <0,0: theMean + = math.radians (360.0) theMean_deg = math.degrees (theMean) середнійBearingDict [ключ] = theMean_deg # це pu ts обчислене середнє значення підшипника назад у таблицю - у рядок "bearing_avg" з arcpy.da.UpdateCursor (fc, bearings) як рядки: для рядка в рядках: рядок [2] = averageBearingDict [рядок [0]] рядки. updateRow ( рядок)

Це було запущено як самостійний сценарій і виконується менш ніж за хвилину.


Перегляньте відео: ArcGIS modelbuilder tutorial - part 01. burdGIS