Який найкращий спосіб скласти карту щільності із зважених точок у QGIS?


18

Я дуже хотів би повторити функціональність інструменту щільності ядра ArcGIS - як я можу це зробити?

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

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

Щільність дикої природи в національному парку Кафуе з осередками сітки 5х5 км та щільністю ядра радіусом 7,5 км

У попередньому питанні про щільність було запропоновано використовувати інструмент GRASS v.kernel для імітації інструменту щільності ядра ArcGIS, але 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

Чи можете ви більше описати свої вхідні дані? Можливо, v.surf.rst буде більш доречним, ніж v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Чи є одне значення підрахунку на комірку сітки, показане вище?
underdark

@underdark - Додано деякі зразкові дані. Це точкові дані з підрахунками (кількість слона, що спостерігається), і на кожну клітинку сітки може бути більше одного спостереження. Зазвичай в ArcGIS "count" стане полем "населення" інструменту щільності ядра.
Simbamangu

Чим більше я думаю про це, тим менше я вважаю, що v.kernel є хорошим вибором для вашого випадку використання. Ви перевірили літературу? Можливо, спочатку задайте питання про те, який метод доречний у цьому випадку.
underdark

моє головне питання - як повторити функціональність щільності ядра від Arcview, що є відомим методом. Ви маєте рацію, v.kernel майже точно не є правильним інструментом для цього!
Simbamangu

@underdark, дякую - я дещо розширив питання, що може допомогти; v.surf.rst виглядає доречно, але може використовувати деякі вказівки щодо його використання.
Simbamangu

Відповіді:


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 фіксує наявність чогось або коли дані є повним переписом. (В останньому випадку поміркуйте, що може означати карта густини доріг для регіону і як можна було б мати сенс "інтерполювати" доріг між недорожними районами.)


У мене, здається, немає r.resamp.filter в моїй панелі інструментів GRASS (на ОС X, GRASS 6.4). Однак - поки ти це не згадав, я не зрозумів, що «теплові карти» - це те саме, що і KD; Я припускав, що вони інтерполюють всю поверхню. Чи працює інструмент "Растрові | теплові карти" в QGIS? Що таке "коефіцієнт занепаду"?
Simbamangu

Я вважаю, що термін "теплова карта" в ГІС був використаний з його початкового значення в таке, яке загалом і неясно посилається майже на будь-яку растрову карту. Я сумніваюся, що будь-який ГІС пропонує функціонал, який відповідає оригінальному значенню.
whuber

Після дослідження інструмент теплової карти в QGIS робить щось подібне до KD у Arc, якщо встановити коефіцієнт затухання до 0 (звуження щільності до 0 у краях радіуса). Здається, є деякі відмінності: обчислені значення комірки на 25 x вище (радіус 5 км / комірка 2,5 км), як це застосовується функція до комірок - Arc, здається, використовує радіус навколо фактичної точки, тоді як QGIS вибирає клітину, що перекривається і звужується з цього моменту.
Simbamangu

2
"Теплова карта" в загальному використанні, здається, означає багато речей - озираючись навколо, я бачу, що він застосовується і до інтерпольованих поверхонь, щільності ядра та простому фарбуванню негладких пікселів. Цікавий документ про оригінальне використання / історію - і, здається, нам, можливо, слід використовувати більш точні терміни при маркуванні засобів QGIS.
Simbamangu

3
@Simbamangu r.resamp.filter є новим в GRASS 7 , але є щомісяця знімок для OS X . Крім того, інструмент теплової карти, здається, не пропонує вибір алгоритму розподілу щільності, тому він не є рівнозначним щільності ядра або r.resamp.filter, я думаю.
Торсті

3

Модуль SAGA «Оцінка щільності ядра» - це те, що ви шукаєте.

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


Я хотів би використовувати SAGA, але я працюю в OSX 10.7 і ще не маю успішного його створення (бінарних файлів для OSX немає); Нещодавно я використовував години, намагаючись більше одного методу компіляції, але збірки завжди не вдається.
Simbamangu

Тоді вам слід задати питання про компіляцію 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, ось мої дані

По-перше, про розмір сітки - ви можете використовувати Plugin -> GRASS -> Edit Current GRASS region та встановити вихідну роздільну здатність. Ваш вихід з v.surf.rst матиме таку роздільну здатність.

Для радіусу параметр, здається, є "напругою". Я не знаю цього алгоритму, але читаючи з посібника, це здається відповідним бітом

"... Висока напруга" збільшує відстані між точками "і зменшує дальність удару кожної точки, низька напруга" зменшує відстань "і точки впливають один на одного на більш тривалий діапазон)."

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

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

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


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").

Ось приклад результату:

карта тепла з бібліотекою java opencarto

Можна змінити силу вирівнювання і колірну палітру.

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