Як обчислити растрову статистику для полігонів?


14

як можна обчислити суми, середні показники тощо растрових точок (багатодіапазонних) на багатокутник векторного шару. Мені сказали, що це називається "зональна статистика". Я спробував це спочатку з QGIS.

Існує спосіб зробити це, але це занадто повільно (перетворити растр у векторний, перетинатися з другим векторним шаром, обчислити геометрію, експортувати номери, обчислити статистику за допомогою електронної таблиці чи іншої програми, повторно імпортувати результати, вічно для мене 350 000 растрових точок).

Мені також дали підказку використовувати сага-гіс. Це "зональна статистика", але вони базуються на категоріях з растрової смуги, а не на полігонах з векторного шару. Тому для використання цього я повинен був би перетворити свій векторний шар у растровий, а потім обчислити статистику.

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

У Saga-gis дійсно багато модулів. Будь ласка, дайте мені знати, який з них є правильним для цієї програми.


Я намагаюся вирішити рішення Rudivonstaden, і такі повідомлення про помилки з'являються під час введення останніх двох команд: >>> zonalstats = qgis.analysis.QgsZonalStatistics (векторний рівень, rasterfile) Traceback (останній виклик останній): Файл "<input>" , рядок 1, в <module> AttributeError: 'module' об'єкт не має атрибута 'аналіз' >>> zonalstats.calculateStatistics (Немає) Відстеження (останній останній виклик): Файл "<input>", рядок 1, у <модулі > NameError: ім'я 'zonalstats' не визначено. Цікаво, чи правильні команди чи чи растровий файл, який я використовую, у правильному форматі? Спасибі!
Дан Вовк

Привіт, Ден. Stackexchange працює трохи інакше, ніж форум. Метою є взаємодія типу Q&A, а не постійне обговорення. Якщо відповіді на початкове запитання не вирішують те, що вам потрібно знати, вам слід або попросити роз'яснення в розділі коментарів, або розглянути питання про нове запитання.
Джей Гуарнері

Дякую за Ваш коментар, Ден. У моїй відповіді відсутня необхідна заява про імпорт, яку тепер слід виправити.
rudivonstaden

Відповіді:


22

Я намагався зробити саме те саме, але з різних причин я прагну використовувати QGIS. Я спробував використовувати v.rast.stats за допомогою плагіна GRASS, а також через плагін Sextante. Останній підхід виявився невдалим, оскільки, здається, він приєднує статистику до тимчасового векторного шару, який він потім видаляє. Плагін GRASS працював, але він не стосується перекриття полігонів.

Зробивши декілька копань (у джерелі багатообіцяючого плагіна ZonalStats), я виявив, що QGIS насправді має вбудовані в API методи зональної статистики, і вони також мають прив'язки Python. Так до тих пір , поки ви тільки шукаєте count, sumі meanстатистика по використанню полігонів, Пітон консолі (Plugins> Python Console) в даний час найпростіший спосіб , щоб прикріпити статистику до таблиці атрибутів полігонів.

  1. Виберіть свій растровий шар в TOC та введіть наступне в консоль (він захоплює назву вихідного файла вашого растрового шару)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Виберіть свій векторний шар і виконайте таку команду в консолі (вона захоплює сам векторний шар)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Виконайте наступні три команди в консолі (вони передають векторний шар і растровий файл вбудованому калькулятору зональної статистики QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

Результати будуть додані як додаткові поля в полігоновому шарі.

Зональна статистика

Зауважте, що якщо ви хочете додати префікс до нових полів (а не просто мати їх як суму, середнє значення та кількість), ви заміните першу команду на кроці 3 на наступну (припускаючи, що ви хочете використовувати "zonal_" як префікс:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics ()
Аарон

У QGIS є плагін Zonal Statistics, тому, ймовірно, не потрібно самостійно виконувати згадані команди: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Цікаво, чому немає можливості обчислити максимум та мінімум значення також.
matandked

Я використовував вашу техніку, але вона видаляє кілька полігонів :(
niahoo

6

Нарешті знайшли це: у Saga-GIS відкрита категорія-полігони та сітка даних, тоді форми-> сітка-> значення сітки-> сітка-статистика для полігонів



3

Здається, це питання було вирішено вже деякий час тому, але я все одно додаю свою ложку в суп, оскільки мені нещодавно були потрібні деякі растрові дані.

Методика QGIS, описана rudivonstaden, спрацювала як шарм, дякую за пораду. Однак у моєму випадку я також хотів знати значення min та max та std для растрових значень у моїх полігонах, і цю функціональність я не міг знайти в QGIS. Я знайшов рішення через функцію isectpolyrst в GME , яка є моїм улюбленим для вирішення задач ГІС. Ця функція дала мені лише необхідну статистику і досить швидко.

PS. GME має трохи нещасну залежність (ArcGIS). Тож хоча сама програма є у вільному доступі для всіх, для її запуску вам потрібна ArcGIS. Але якщо у вас є ArcGIS (будь-який рівень ліцензії), рекомендую спробувати його.

Редагувати:

Я отримав статистику, яку хотів, але згодом дізнався, що трохи поспішно підскочив до висновків, переглянувши фактичну кількість. Ви отримуєте статистику, так, але лише для першої групи в растрі. Отже, якщо ви працюєте з 3-смуговим растровим зображенням, статистика є неповною. Я мав би вказати кількість каналів у своєму початковому дописі. Найкраще використовувати SAGA-GIS, як stn, запропонований вище, якщо ви працюєте з багатодіапазонними растровими зображеннями.


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

за замовчуванням обчислює лише кількість, суму та середнє значення (як ви можете сказати з Raster -> Zonal StatisticsQGIS Desktop, це може зробити набагато більше).

Якщо ви, наприклад, хочете обчислити лише середнє значення, яке ви повинні використовувати:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

див. API для всіх параметрів.

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