Підрахунок послідовних значень пікселів для набору растрових даних за допомогою ArcGIS Spatial Analyst?


23

Я використовую ArcGIS 10 з Spatial Analyst.

У мене є набір растрових (всього 8), які містять лише 1 або 0 для кожної комірки. Кожна растра представляє дані, що варті різного року. Для аргументів рік 1 - 8 рік.

Я можу додати всі растри разом, що дасть мені остаточну сітку зі значеннями від 0 до 8. 8, що вказує на те, що комірка постійно була 1 для набору растрових (усі роки).

Я хотів би знайти для кожної комірки найдовше підряд номер 1.

Так, наприклад, загальна сітка може записувати для однієї комірки значення 5, але для 8 сіток ця клітинка має найбільшу кількість послідовних 1, рівну 3. Або інший спосіб вираження цього: 3 роки комірка була 1 тоді він почав коливатися між нулями та одиницями.

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

Якісь ідеї?


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

1
Загальний коментар (натхненний цим зауваженням @MLowry): будь ласка, оскаржуйте питання, коли вони виглядають цікавими або чітко сформульовані. Хороші питання керують усім на нашому сайті; будь ласка, давайте зробимо все можливе, щоб нагородити тих, хто їх просить!
whuber

Відповіді:


14

Оскільки це локальна операція, давайте розробимо, як це зробити для однієї комірки: Алгебра Map подбає про решту.

Спершу зауважте, що порядок проведення растерів очевидно має значення. Тому статистика одноклітинних комірок, така як сума комірок, цього не зробить.

Якби ми стикалися з такою послідовністю, як 01110101 у даній комірці, ми обробляли б це від початку до кінця та

  1. Почніть з підрахунку нуля.

  2. Збільшуйте кількість кожного разу, коли ми стикаємося з 1.

  3. Скидання підрахунку кожного разу, коли ми зустрічаємо 0, після збереження останнього підрахунку .

  4. Наприкінці візьміть максимально збережену кількість (включаючи остаточну кількість).

Крок 1 реалізований з постійною нульовою сіткою. Етапи 2 і 3 залежать від того, з чим ми стикаємося: тому це умовна операція. Крок 4 однозначно - локальний максимум. Ми зафіксували б це, трохи формальніше, як:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

Це найкраще робити зі сценарієм Python, коли у вас є багато сіток, але з восьми - не важко розгортати цикл і виписувати кроки вручну. Це виявляє невелику проблему: result=max(longest,count)це свого роду "побічний ефект", який важко кодувати за допомогою растрових операцій. (Але це можна зробити, як показано у другому рішенні нижче.) Це також неефективно, оскільки додає додатковий розрахунок на кожному кроці. Тому ми трохи модифікуємо підхід, маючи на меті відкласти maxоперацію до кінця. Це вимагатиме збереження окремого рахунку на кожному етапі.

Проходячи цей процес, я також знайшов ярлик для першого кроку. Це призводить до наступного рішення, яке, хоч і трохи тривале та оперативна пам'ять, є простим і включає швидко виконані кроки:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

Фактичний синтаксис залежить від вашої версії ArcMap. (Наприклад, CellStatisticsнова версія до версії 10, я вважаю, але локальна максимальна операція завжди була доступна.)

У прикладі з введенням 01110101 послідовність сіток "результат *" містила б значення 0, 1, 2, 3, 0, 1, 0, 1, тому в кінці CellStatisticsповертається 3, довжина найдовшої рядки 1-х.

Якщо оперативної пам’яті мало, рішення можна модифікувати для повторного використання проміжних результатів, ціною приблизно вдвічі збільшивши час виконання:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

У прикладі з введенням 01110101 значення ("темп", "результат") будуть (NoData, 0) після першого рядка, а після кожної пари операцій ("Con", "CellStatistics") значення будуть (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Ще раз остаточне значення - 3.

Регулярний шаблон виразів алгебри Map у будь-якому рішенні вказує, як кодувати алгоритм як цикл у сценарії, змінюючи індекси відповідно до кожної ітерації.


У блоці коду типу може бути помилка
друку

1
@ML Спасибі (добрі очі!): Це зараз виправлено. Важко зробити псевдокод абсолютно правильним; людський огляд - справжній актив у пошуку помилок. Крім того, хоча я не перевіряв рішення в ArcGIS, я реалізував перше рішення в R, тому маю певну впевненість, що підхід правильний.
whuber

1
"Побій", але ти знову ТИ, людина, яка знає! Боже, допоможи нам решті, якщо коли-небудь на тебе наїде автобус! Ваш початковий підхід Python був напрямком, про який я думав, але я знаю, що з растрами часто можна зробити все так сильно, як ви довели. Якщо ви опинитесь у Британії, було б честі купити вам пінту нашого найкращого пива з кімнатною температурою! :)
Hornbydd

Дякую, Дункан: але перевірити чудове рішення Енді Харфута!
whuber

14

Просто балакайте про це і цікавитесь, чи можете ви підійти до проблеми, розглядаючи вхідні сітки як бінарний потік. Це дозволить вам об'єднати їх, щоб дати унікальне сумарне ціле число для послідовності - тобто 01110101 = 117. Це значення потім може бути перекласифіковане для отримання максимальної кількості послідовних 1-х.

Ось приклад, який показує один із способів поєднання восьми сіток:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

Бітові операції також можуть бути натиснуті на обслуговування для цього кроку. Крім того, ви можете використовувати комбінований з подальшим обчисленням поля. (Обчислення поля матиме вираз, подібний до попереднього.)

Таблиця перекласифікації повинна містити максимальну довжину пробігу для всіх значень між 00000000B = 0 та 11111111B = 255. Для того, ось вони:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

Цей підхід обмежений приблизно 20 сітками в ArcGIS: використання більше, ніж це може створити громіздку таблицю атрибутів. ( Combineконкретно обмежено 20 сітками.)


Величезний +1: Це дуже гарна ідея. (Єдине обмеження полягає в тому, що якщо задіяно більше 31 сітки, у вас не вистачить шматочків для використання.) Я взяв на себе сміливість трохи сформувати вашу ідею, щоб інші могли побачити, як це легко реалізувати.
whuber

3

Чи думали ви змінити значення з 0 і 1 на значення потужністю 2 (1,2,4,8,16,32). При комбінуванні 8 сіток ви отримаєте унікальні значення для кожної комірки, що дасть вам послідовну інформацію (тобто: значення 3 означає рік 1 та 2, де значення 54 було б років 6 - 8).

Просто думка


Саме це запропонував @Andy Harfoot на кілька годин раніше, Райан. :-)
whuber

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