Пиксели слева представляют местоположения дерева и связанные с ними радиусы короны (то есть значения пикселей в диапазоне от 2 до 5). Я хотел бы буферизовать эти растровые пиксели по значению радиуса короны. Изображение справа - это то, чего я надеюсь достичь, используя только методы растровой обработки .
Сначала я бы подумал об использовании круговой фокусной суммы в ArcGIS, хотя настройка соседства является фиксированным значением, которое не учитывает радиус коронки переменного размера.
Что такое хороший метод для «буферизации» пикселей по их значениям?
Ответы:
Вот чистое растровое решение по
Python 2.7
использованиюnumpy
иscipy
:Входные данные:
Выход:
источник
Векторный подход
Эта задача может быть выполнена в три этапа:
Raster To Point
;Buffer
(используяVALUE
поле в качестве поля буфера );Feature To Raster
,Примечание: использование поля буфера позволяет избежать расчета буфера для каждого значения радиуса короны.
Растровый подход
Избегая векторного решения, эта проблема предлагает использовать своего рода сотовые автоматы на основе ближайших соседей. Предполагая, что все черные пиксели являются нулями, пиксели возводятся в квадрат и их размер равен 1 (или, альтернативно, масштабируется своевременно), правила для принятия очень просты:
VALUE
) больше 1, оно становится равным,VALUE-1
а затем учитывает окружающие пиксели. Если их значения меньше чемVALUE-1
, эти пиксели рождаются или растут, и их значение становитсяVALUE-1
. В противном случае эти пиксели сохраняются и остаются без изменений.VALUE<=1
ничего не делать (пиксель мертв!).Эти правила должны применяться до тех пор, пока все пиксели не станут мертвыми, то есть их значения равны 0 или 1. То есть
N-1
, гдеN
максимальное значение, которое вы имеете во входном растре. Этот подход может быть довольно легко реализован с немного Python и Numpy.источник
Другой вариант - создать отдельные растры для каждого значения пикселя, в данном случае 4 растра, с условием. Затем разверните растры на количество пикселей, соответствующее значению растра (возможно, перебирая список значений). Наконец, объедините растры (алгебраические или пространственные), чтобы создать один двоичный растр для крон деревьев.
источник
Это сложный вопрос, чтобы сделать это в растре, потому что у вас нет возможности использовать значение пикселя для определения размера буфера. Поэтому вам нужно будет сделать фокусный фильтр для каждого значения, как вы уже сказали.
Вот возможный ответ, чтобы сделать это только с 3 фильтрами (я не мог найти меньше), но не совсем так, как упомянуто Whuber: ваши буферы будут усечены, когда деревья расположены близко друг к другу.
1) РЕДАКТИРОВАТЬ: Евклидово распределение (это не полностью решает проблему, так как оно сокращает буферы в окрестностях меньших деревьев, но это лучше, чем артефакты моего первого решения).
2) евклидово расстояние вокруг каждого пикселя
3) растровый калькулятор (алгебра карт) с условным оператором
Обратите внимание, что вы можете настроить условие в зависимости от ваших потребностей с точки зрения радиуса (с центральным пикселем или без него)
источник
Интересно, почему вы не используете инструмент расширения ArcGIS ?
В случае перекрытия: последняя
expand
команда будет охватывать предыдущие.источник
Если у вас есть позиция в пикселях, радиус и алгоритм средней точки круга (вариант алгоритма Брезенхэма) дают подсказку. IMO, легко создать многоугольник из этого подхода, и я думаю, что это легко реализовать в Python. Объединение этого набора полигонов дает вам площадь покрытия.
источник