Каков наилучший способ создания карты плотности из взвешенных точек в QGIS?

18

Мне бы очень хотелось повторить функциональность инструмента ArcGIS Kernel Density - как я могу это сделать?

Я хотел бы ограничить ответы простыми в установке бесплатными программами с открытым исходным кодом - т.е. QGIS легко устанавливается с GRASS на всех платформах, поэтому QGIS + GRASS подойдет, а SAGA - нет (к сожалению, поскольку у него есть то, что может быть идеальным инструментом).

Я пытаюсь составить карты плотности дикой природы по охраняемым территориям в QGIS. Карта плотности в следующем примере была создана в ArcGIS из точечных наблюдений за дикой природой, с необработанными подсчетами размера группы (поле в векторном файле), используемых для взвешивания плотности каждой ячейки сетки в инструменте Kernel Density (SpatialAnalyst), с выбранный радиус поиска и размер ячейки сетки:

Плотность живой природы в национальном парке Кафуэ с ячейками сетки 5x5 км и плотностью ядра радиусом 7,5 км

В предыдущем вопросе о плотности было предложено использовать инструмент 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
Simbamangu
источник
Можете ли вы описать ваши входные данные больше? Возможно, v.surf.rst будет более подходящим, чем v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . У вас есть одно значение счетчика на ячейку сетки, показанное выше?
Подземье
@underdark - добавлены примеры данных. Это точечные данные с количеством отсчетов (количество увиденных слонов), и может быть более одного наблюдения на ячейку сетки. Обычно в ArcGIS «count» становится полем «Population» инструмента плотности ядра.
Симбамангу
Чем больше я об этом думаю, тем меньше верю, что v.kernel - хороший выбор для вашего случая использования. Вы проверили литературу? Возможно, сначала задайте вопрос о том, какой метод подходит в этом случае.
Подземье
Мой основной вопрос - как повторить функциональность плотности ядра из Arcview, который является известным методом. Вы правы, v.kernel почти наверняка не подходит для этого!
Симбамангу
@underdark, спасибо - я несколько расширил вопрос, который может помочь; v.surf.rst выглядит уместно, но может использовать некоторые рекомендации по его использованию.
Симбамангу

Ответы:

8

Согласно странице справочника, команда GRASS r.resamp.filter сделает для растров, представляющих точечные данные, именно то, что ArcGIS сделает для точечных слоев : используйте filter=boxопцию для «простого» растра и filter=gaussопцию для другого ядра ArcGIS. Используйте -nфлаг, чтобы избежать распространения нулей.


Обратите внимание, что оценки плотности ядра (также называемые «тепловыми картами») не являются интерполяцией данных. Значение KDE в местоположении x оценивает величину значения " Z " на единицу площади около x . (Радиус или «полоса пропускания» дает количественную оценку того, что означает «рядом».) Значения Z не нужно определять в каждом возможном месте на карте. Например, Z может представлять присутствие чего-то, например, человека, и в этом случае KDE дает плотность населения . Также значения Z не должны постоянно изменяться на карте. Для интерполяции предполагается, что Zопределяется во всех местах и ​​что данные представляют собой наблюдения значений Z в указанных точках. Интерполятор пытается предсказать ненаблюдаемые значения Z во всех других точках. Это имело бы смысл, когда Z , скажем, температура или давление, но обычно бессмысленно, когда Z регистрирует наличие чего-либо или когда данные представляют собой полную перепись. (В последнем случае подумайте, что может означать карта плотности дорог для региона, и как можно было бы иметь смысл «интерполировать» дороги через недорожные районы.)

Whuber
источник
У меня, кажется, нет r.resamp.filter в моем наборе инструментов GRASS (на OS X, GRASS 6.4). Однако - пока вы не упомянули об этом, я не осознавал, что «тепловые карты» - это то же самое, что и KD; Я предположил, что они интерполировали всю поверхность. Использует ли инструмент Растр | Тепловая карта в QGIS KD? Что такое «коэффициент распада»?
Симбамангу
Я полагаю, что термин «тепловая карта» в ГИС был перенесен из его первоначального значения в то, что в целом и неопределенно относится почти к любой растровой карте. Я сомневаюсь, что любая ГИС предлагает функциональность, которая соответствует первоначальному значению.
whuber
После исследования инструмент тепловой карты в QGIS делает что-то похожее на KD в Arc, если вы установите коэффициент затухания равным 0 (сужая плотность до 0 по краям радиуса). Кажется, есть некоторые различия: вычисленные значения ячеек в 25 раз выше (радиус 5 км / ячейка 2,5 км), как и способ применения функции к ячейкам - Arc, кажется, использует радиус вокруг фактической точки, тогда как QGIS выбирает перекрывающуюся ячейку и сужается с этого момента.
Симбамангу
2
«Тепловая карта» в общем использовании, кажется, означает много вещей - оглядываясь по сторонам, я вижу, что она применяется к интерполированным поверхностям, плотности ядра и простой окраске не сглаженных пикселей. Интересная статья об оригинальном использовании / истории - и, похоже, нам следует использовать более точные термины при маркировке инструментов QGIS.
Симбамангу
3
@Simbamangu r.resamp.filter впервые в GRASS 7 , но для OS X есть ежемесячный снимок . Кроме того, инструмент тепловых карт, кажется, не представляет выбора для алгоритма распределения плотности, поэтому он не совсем эквивалентен плотности ядра или r.resamp.filter, я думаю.
Торсти
3

Модуль SAGA «Оценка плотности ядра» - это то, что вы ищете.

Установите интерфейс модуля SAGA в QGIS (в меню: Плагины -> Получить плагины Python ..) и используйте модуль. Удачи!

Владимир
источник
Я ЛЮБЛЮ использовать SAGA, но работаю в OSX 10.7 и до сих пор не смог успешно ее собрать (нет бинарных файлов для OSX); Я использовал часы, пытаясь использовать более одного метода компиляции, но сборки всегда терпят неудачу.
Симбамангу
Тогда вам лучше задать вопрос о компиляции SAGA на OSX 10.7. Как я вижу, SAGA - единственная разумная альтернатива инструменту ArcGIS KD.
Владимир
3

Действительно упрощенный метод с GRASS GIS, который ближе к плотности точек в ArcMap, чем к плотности ядра:

  1. Импортируйте точки на растровую карту, r.in.xyzиспользуя метод = сумма с указанным разрешением растра (устанавливается с помощью g.region).

  2. Используйте r.neighborsдля сглаживания карты с методом = средний (по умолчанию) и используйте размер параметра, чтобы установить радиус поиска.

(У меня нет доступа к GRASS на данный момент, поэтому я на самом деле не пробовал это!)

Торсти
источник
v.in.xyzи v.neighborsможет также работать. В руководстве не указано, как вы устанавливаете, какой атрибут используется v.neighbors.
Торсти
2

Поскольку вы запросили дополнительные инструкции на v.surf.rst, вот мои материалы

Во-первых, о размере сетки - вы можете использовать Плагин -> GRASS -> Редактировать текущую область GRASS и установить выходное разрешение. Ваш вывод из v.surf.rst будет иметь это разрешение.

Для радиуса «натяжение» представляется параметром. Я не эксперт по этому алгоритму, но, читая из руководства, похоже, это немного

«... высокое напряжение» увеличивает расстояния между точками «и уменьшает диапазон воздействия каждой точки, низкое напряжение« уменьшает расстояние », и точки влияют друг на друга в более длинном диапазоне) ..»

Таким образом, вы можете использовать параметр натяжения примерно так же, как и параметр радиуса.

Исходя из ваших примеров данных, результат v.surf.rst выглядит следующим образом и кажется разумным, учитывая, что он использует счетчики в качестве весов для интерполяции

введите описание изображения здесь

spatialthoughts
источник
1
Спасибо за это - гораздо проще понять, чем на странице справки. Как отмечалось выше @whuber, интерполяция не является правильным методом для данных такого рода.
Симбамангу
2

Хотя я не тестировал его, в репозитории QGIS Contributors есть плагин под названием «Оценка диапазона дома с помощью R». Это включает расчеты ядра (плотности?). Я считаю, что если это сработает, то это будет лучший метод. R сделает реальный статистический метод расчета плотности ядра.

Если у вас установлен R, вы сможете установить плагин и попробовать его.

Алекс Лейт
источник
1

Если вы согласны немного программировать на Java вне qgis, вы можете просто использовать эту библиотеку построителя карт плотности .

Используя конструктор HeatMapBuilder(int w, int h, int[][] pts, int[] weights), можно присваивать вес каждой точке по мере необходимости. Выходное изображение можно получить с помощью getImage()метода и сохранить на диске с помощью ImageIO.write("mymap.png").

Вот пример вывода:

тепловая карта с библиотекой opencarto java

Можно изменить силу сглаживания и цветовую палитру.

жюльен
источник