Я использую ArcGIS 10 с Spatial Analyst.
У меня есть набор растров (всего 8), каждый из которых содержит 1 или 0 для каждой ячейки. Каждый растр представляет данные за разные годы. Для аргументов ради года 1 до года 8.
Я могу добавить все растры вместе, что даст мне окончательную сетку со значениями в диапазоне от 0 до 8. 8, указывающее, что ячейка была постоянно 1 для набора растров (все годы).
Я хотел бы найти для каждой ячейки самое длинное число последовательных единиц.
Так, например, общая сетка может записать для одной ячейки значение, скажем, 5, но из 8 сеток эта ячейка имеет наибольшее последовательное число 1, равное 3. Или другой способ выразить это в течение 3 лет, когда ячейка была 1 затем он начал колебаться между нулями и единицами.
Мои навыки растровой обработки не так высоки, как мои навыки векторной обработки, и я хорошо посмотрел файл справки ESRI, но я не могу понять, как этого добиться, используя готовые инструменты геообработки?
Любые идеи?
Ответы:
Поскольку это локальная операция, давайте разберемся, как это сделать для отдельной ячейки: Map Algebra позаботится обо всем остальном.
Во-первых, обратите внимание, что порядок растров имеет значение. Поэтому статистика единичных ячеек, такая как сумма ячеек, этого не сделает.
Если бы мы встретили последовательность, такую как 01110101 в данной ячейке, мы бы обработали это от начала до конца и
Начните с нуля.
Увеличивайте счет каждый раз, когда мы сталкиваемся с 1.
Сбрасывайте счетчик каждый раз, когда мы сталкиваемся с 0, после сохранения последнего счетчика .
В конце возьмите максимальный сохраненный счет (включая окончательный счет).
Шаг 1 реализован с сеткой с постоянным нулем. Шаги 2 и 3 зависят от того, с чем мы сталкиваемся: поэтому это условная операция. Шаг 4 явно является локальным максимумом. Тогда мы бы закодировали это немного более формально:
Лучше всего это сделать со скриптом Python, когда у вас много сеток, но с восьмью нет ничего сложного в том, чтобы развернуть цикл и выписать шаги вручную. Это обнаруживает небольшую проблему:
result=max(longest,count)
это своего рода «побочный эффект», который трудно кодировать растровыми операциями. (Но это можно сделать, как показано во втором решении ниже.) Это также неэффективно, поскольку добавляет дополнительные вычисления на каждом шаге. Поэтому мы немного изменим подход с целью отложитьmax
операцию до конца. Это потребует сохранения отдельного счета на каждом этапе.При прохождении этого процесса я также нашел ярлык для первого шага. Это приводит к следующему решению, которое, хотя и немного длинное и требует много оперативной памяти, является простым и включает быстро выполняемые шаги:
Фактический синтаксис зависит от вашей версии ArcMap. (Например, я
CellStatistics
новичок в версии 10, но локальная максимальная операция всегда была доступна.)В примере с вводом 01110101 последовательность сеток «result *» будет содержать значения 0, 1, 2, 3, 0, 1, 0, 1, поэтому в конце
CellStatistics
будет возвращаться значение 3, длина самой длинной строки 1 - х.Если оперативной памяти недостаточно, решение может быть модифицировано для повторного использования промежуточных результатов, что приблизительно удваивает время выполнения:
В примере с вводом 01110101 значения ("temp", "result") будут (NoData, 0) после первой строки и после каждой пары операций ("Con", "CellStatistics") значения будут равны (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Еще раз окончательное значение 3.
Обычный шаблон выражений алгебры карт в любом решении указывает, как кодировать алгоритм как цикл в скрипте, изменяя индексы в зависимости от ситуации при каждой итерации.
источник
Просто поговорите об этом и спросите себя, можете ли вы подойти к проблеме, рассматривая входные сетки как двоичный поток. Это позволит вам объединить их, чтобы получить уникальное итоговое целое число для последовательности - т.е. 01110101 = 117. Затем это значение можно было бы реклассифицировать, чтобы получить максимальное количество последовательных единиц.
Вот пример, показывающий один из способов объединения восьми сеток:
Побитовые операции также могут быть введены в действие для этого шага. В качестве альтернативы вы можете использовать объединение с последующим вычислением поля. (У вычисления поля будет выражение, подобное предыдущему.)
В таблице переклассификации должны быть указаны максимальные длины прогонов для всех значений от 00000000B = 0 до 11111111B = 255. По порядку они следующие:
Этот подход ограничен примерно 20 сетками в ArcGIS: использование большего количества может создать громоздкую таблицу атрибутов. (
Combine
специально ограничено 20 сетками.)источник
Задумывались ли вы об изменении значений от 0 и 1 до значений со степенью 2 (1,2,4,8,16,32). Когда вы объедините 8 сеток, вы получите уникальные значения для каждой ячейки, которые предоставят вам последовательную информацию (то есть: значение 3 означает год 1 и 2, где значение 54 будет годами 6-8).
Просто мысль
источник