Как рассчитать растровую статистику для полигонов?

14

Как я могу рассчитать суммы, средние значения и т. д. растровых точек (многоканальный) на полигон векторного слоя. Мне сказали, что это называется "зональная статистика". Сначала я попробовал это с QGIS.

Есть способ сделать это, но это слишком медленно (конвертировать растр в вектор, пересекать со вторым векторным слоем, вычислять геометрию, экспортировать числа, вычислять статистику с помощью электронной таблицы или другой программы, повторно импортировать результаты, на что уходит навсегда 350.000 растровых точек).

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

Кажется, это неправильный способ решить эту проблему. Не было бы возможности учесть растровые точки, которые принадлежат двум или более полигонам, потому что они пересекаются границей полигона. Я предполагаю, что статистика на основе полигонов должна быть в состоянии справиться с этим, поэтому я также предполагаю, что я еще не нашел правильный модуль.

Сага-Гис действительно много модулей. Пожалуйста, дайте мне знать, какой из них подходит для этого приложения.

STN
источник
Я пробую решение Рудивонстадена, и при вводе последних двух команд появляются следующие сообщения об ошибках: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (последний вызов был последним): Файл "<input>" , строка 1, в <module> AttributeError: у объекта 'module' нет атрибута 'analysis' >>> zonalstats.calculateStatistics (None) Traceback (последний вызов был последним): файл "<input>", строка 1, в <module > NameError: имя 'zonalstats' не определено. Мне интересно, правильны ли команды или используемый растровый файл имеет правильный формат? Благодарность!
Дэн Вольф
Привет, Дэн. Stackexchange работает несколько иначе, чем на форуме. Цель состоит в том, чтобы иметь взаимодействие типа вопросов и ответов, а не постоянное обсуждение. Если ответы на исходный вопрос не решают то, что вам нужно знать, вы должны либо попросить разъяснений в разделе комментариев, либо подумать над тем, чтобы задать новый вопрос.
Джей Гварнери
Спасибо за ваш комментарий, Дэн. В моем ответе отсутствовал необходимый оператор импорта, который теперь должен быть исправлен.
Рудивонстаден

Ответы:

22

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

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

  1. Выберите растровый слой в оглавлении и введите следующее в консоль (он захватывает имя исходного файла вашего растрового слоя)

    >>> 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_")
rudivonstaden
источник
1
+1 qgis.analysis.QgsZonalStatistics ()
Аарон
В QGIS есть плагин Zonal Statistics, поэтому, вероятно, вам не нужно выполнять упомянутые команды самостоятельно: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Интересно, почему нет возможности рассчитать максимум и минимум? ценности также.
matandked
Я использовал вашу технику, но она удаляет некоторые полигоны :(
niahoo
6

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

STN
источник
3

Вы можете сделать это довольно легко с PostGIS. Смотрите этот учебник: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01

Пьер Расин
источник
THX за идею. Я надеялся сделать это без добавления и изучения еще одного программного обеспечения. Я буду держать PostGIS в уме, хотя позже.
STN
3

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

Методология QGIS, описанная rudivonstaden, работала как шарм, спасибо за подсказку. Однако в моем случае я также хотел знать минимальные и максимальные значения и стандартное значение для растровых значений в моих полигонах и ту функциональность, которую я не смог найти в QGIS. Я нашел решение с помощью функции isectpolyrst в GME , которая является моей любимой для решения задач ГИС. Эта функция дала мне только необходимую статистику и довольно быстро.

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

РЕДАКТИРОВАТЬ:

Я получил желаемую статистику, но позже узнал, что поспешно пришел к выводам, посмотрев на реальные цифры. Да, вы получаете статистику, но только для первой группы в растре. Поэтому, если вы работаете с 3-полосным растровым изображением, статистика будет неполной. Я должен был указать количество каналов в моем оригинальном сообщении. Лучше всего использовать SAGA-GIS как stn, предложенный выше, если вы работаете с многоканальными растровыми изображениями.

GISinHelsinki
источник
3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

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

Если вы, например, хотите вычислить только среднее значение, которое вы должны использовать:

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

см. API для всех вариантов.

Фицрой Хогсфлеш
источник