Мне бы очень хотелось повторить функциональность инструмента ArcGIS Kernel Density - как я могу это сделать?
Я хотел бы ограничить ответы простыми в установке бесплатными программами с открытым исходным кодом - т.е. QGIS легко устанавливается с GRASS на всех платформах, поэтому QGIS + GRASS подойдет, а SAGA - нет (к сожалению, поскольку у него есть то, что может быть идеальным инструментом).
Я пытаюсь составить карты плотности дикой природы по охраняемым территориям в QGIS. Карта плотности в следующем примере была создана в ArcGIS из точечных наблюдений за дикой природой, с необработанными подсчетами размера группы (поле в векторном файле), используемых для взвешивания плотности каждой ячейки сетки в инструменте Kernel Density (SpatialAnalyst), с выбранный радиус поиска и размер ячейки сетки:
В предыдущем вопросе о плотности было предложено использовать инструмент GRASS v.kernel для имитации инструмента ArcGIS Kernel Density, но v.kernel не выполняет ту же работу . После просмотра руководства и (успешно) создания карты плотности кажется, что функция v.kernel работает только с плотностью точек , и нет возможности дать переменную для каждой точки (например, необработанные значения) для взвешивания каждой точки ,
ОБНОВИТЬ
Кажется, что *.surf.*
в GRASS есть различные инструменты, которые могут помочь создать поверхность плотности - и они принимают весовой столбец или значение z или выполняются на растрах. @underdark предложил v.surf.rst - а zcolumn - моя весовая (счетная) переменная - но я не могу понять, как попросить инструмент создать определенный размер сетки или использовать определенный радиус.
Предложения о том, как использовать v.surf.rst или любой другой метод?
Образец данных
x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0
Ответы:
Согласно странице справочника, команда GRASS r.resamp.filter сделает для растров, представляющих точечные данные, именно то, что ArcGIS сделает для точечных слоев : используйте
filter=box
опцию для «простого» растра иfilter=gauss
опцию для другого ядра ArcGIS. Используйте-n
флаг, чтобы избежать распространения нулей.Обратите внимание, что оценки плотности ядра (также называемые «тепловыми картами») не являются интерполяцией данных. Значение KDE в местоположении x оценивает величину значения " Z " на единицу площади около x . (Радиус или «полоса пропускания» дает количественную оценку того, что означает «рядом».) Значения Z не нужно определять в каждом возможном месте на карте. Например, Z может представлять присутствие чего-то, например, человека, и в этом случае KDE дает плотность населения . Также значения Z не должны постоянно изменяться на карте. Для интерполяции предполагается, что Zопределяется во всех местах и что данные представляют собой наблюдения значений Z в указанных точках. Интерполятор пытается предсказать ненаблюдаемые значения Z во всех других точках. Это имело бы смысл, когда Z , скажем, температура или давление, но обычно бессмысленно, когда Z регистрирует наличие чего-либо или когда данные представляют собой полную перепись. (В последнем случае подумайте, что может означать карта плотности дорог для региона, и как можно было бы иметь смысл «интерполировать» дороги через недорожные районы.)
источник
Модуль SAGA «Оценка плотности ядра» - это то, что вы ищете.
Установите интерфейс модуля SAGA в QGIS (в меню: Плагины -> Получить плагины Python ..) и используйте модуль. Удачи!
источник
Действительно упрощенный метод с GRASS GIS, который ближе к плотности точек в ArcMap, чем к плотности ядра:
Импортируйте точки на растровую карту,
r.in.xyz
используя метод = сумма с указанным разрешением растра (устанавливается с помощьюg.region
).Используйте
r.neighbors
для сглаживания карты с методом = средний (по умолчанию) и используйте размер параметра, чтобы установить радиус поиска.(У меня нет доступа к GRASS на данный момент, поэтому я на самом деле не пробовал это!)
источник
v.in.xyz
иv.neighbors
может также работать. В руководстве не указано, как вы устанавливаете, какой атрибут используетсяv.neighbors
.Поскольку вы запросили дополнительные инструкции на v.surf.rst, вот мои материалы
Во-первых, о размере сетки - вы можете использовать Плагин -> GRASS -> Редактировать текущую область GRASS и установить выходное разрешение. Ваш вывод из v.surf.rst будет иметь это разрешение.
Для радиуса «натяжение» представляется параметром. Я не эксперт по этому алгоритму, но, читая из руководства, похоже, это немного
Таким образом, вы можете использовать параметр натяжения примерно так же, как и параметр радиуса.
Исходя из ваших примеров данных, результат v.surf.rst выглядит следующим образом и кажется разумным, учитывая, что он использует счетчики в качестве весов для интерполяции
источник
Хотя я не тестировал его, в репозитории QGIS Contributors есть плагин под названием «Оценка диапазона дома с помощью R». Это включает расчеты ядра (плотности?). Я считаю, что если это сработает, то это будет лучший метод. R сделает реальный статистический метод расчета плотности ядра.
Если у вас установлен R, вы сможете установить плагин и попробовать его.
источник
Если вы согласны немного программировать на Java вне qgis, вы можете просто использовать эту библиотеку построителя карт плотности .
Используя конструктор
HeatMapBuilder(int w, int h, int[][] pts, int[] weights)
, можно присваивать вес каждой точке по мере необходимости. Выходное изображение можно получить с помощьюgetImage()
метода и сохранить на диске с помощьюImageIO.write("mymap.png")
.Вот пример вывода:
Можно изменить силу сглаживания и цветовую палитру.
источник