Использование плагина QGIS Zonal Stats из консоли Python?

9

Я использую плагин Zonal Stats в QGIS для извлечения растровой статистики из наложенных полигонов (у меня есть шейп-файлы распределения видов, и я хочу извлечь данные об окружающей среде из диапазона каждого вида). У меня есть около 300 файлов, из которых мне нужно получить данные, и поэтому я хотел бы написать скрипт для запуска в консоли python, однако я новичок в работе с python и не знаю, как это сделать.

Томас
источник
Чад - да, это похожий вопрос, но более конкретный. Никто не ответил на другой вопрос, вместо этого они предложили другие способы решения проблемы. Я не знаю, как удалить другой пост
Thomas
В другом вопросе я указал вам r-скрипт, способный на то, что вы хотите, и Сильвестр Снекли назвал вам точный метод в python. Если вы не привыкли писать код на python или r, то все дальнейшие подсказки вам не помогут. Вам нужен самокодированный скрипт или много щелчков мышью. Изучите немного кодирования, попробуйте примеры и сообщите, если что-то не работает.
Curlew
@Curlew - метод Сильвестра, хотя и звучит очень хорошо, представляет для меня огромную кривую обучения, и у меня нет времени делать это в данный момент. Я ценю помощь Сильвестра, но это был не простой ответ, который я получил. Я думал, что у меня была большая часть кода, который я написал в посте, который я упоминал в своем другом вопросе ( gis.stackexchange.com/questions/23203/… ). Если метод Сильвестра - единственный способ сделать это в python, возможно, я недооценил, насколько это будет сложно.
Томас
@Curlew - Ваш R-скрипт действительно работает, спасибо. Единственное, что мне еще предстоит выяснить, - это как добавить результаты, возвращенные в R, в файл .dbf для моих шейп-файлов (любая помощь в этом будет очень признательна).
Томас

Ответы:

13

Приведенный ниже код работал для меня QGis 1.8.0

Вы можете изменить это, чтобы разместить несколько файлов с некоторым циклом.

from qgis.analysis import QgsZonalStatistics

#specify polygon shapefile vector
polygonLayer = QgsVectorLayer('F:/temp/zonalstat/zonePoly.shp', 'zonepolygons', "ogr") 

# specify raster filename
rasterFilePath = 'F:/temp/zonalstat/raster1.tif'

# usage - QgsZonalStatistics (QgsVectorLayer *polygonLayer, const QString &rasterFile, const QString &attributePrefix="", int rasterBand=1)
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)
Винаян
источник
Отлично. Спасибо большое vinayan, это именно то, что я был после.
Томас
Также см. Здесь для альтернативного решения с использованием R
Томас
рад, что это помогло вам!
Винаян
@vinayan QProgressDialog полезен для визуальных сред, где вы хотите увидеть, как далеко продвинулись вычисления. Это не имеет смысла из командной строки. Вы можете использовать Noneв качестве параметра, и он отлично работает. Тогда вам не нужна PyQt4..строка from или progressDialog = строка. См. Аналогичный пост на gis.stackexchange.com/questions/23203/…
rudivonstaden
@rudivonstaden - это имеет смысл сейчас .. я обновил ответ
vinayan
2

Вот способ получить то, что вы хотите в SAGA GIS. Возможно, это не то решение, которое вам нужно, но оно работает. Я рассмотрю причины, по которым мои плагины выходят из строя, и обновлю их как можно скорее.

Установите SAGA GIS (также должна быть доступна через apt-get или aptitudbe в вашем дистрибутиве Linux).

  • Запустите SAGA, загрузите свой растр и векторную форму (Модули меню -> Файл -> Импорт GDAL / OGR). Вы можете увидеть процесс ниже.
  • Выполнить модуль «Статистика сетки для полигонов» (Меню Модули -> Форма -> Сетка -> Значения сетки). Значения добавляются непосредственно в таблицу. Диалог должен выглядеть таквведите описание изображения здесь
  • Перейдите на вкладку «Данные» в рабочей области, щелкните правой кнопкой мыши на векторный слой и выберите « сохранить как », чтобы экспортировать фигуру с добавленными атрибутами. Вы также можете отобразить таблицу атрибутов с помощью щелчка правой кнопкой мыши, а затем нажмите на таблицу Показать

Это работает для набора данных, который вы мне прислали. Также возможно вызывать модули SAGA в QGIS через SEXTANTE как процесс BATCH. Для этого просто активируйте модули SAGA в опциях SEXTANTE.

кроншнеп
источник
спасибо за предложение, но я уже пробовал сагу - результаты, которые она вызвала, были противоречивыми, то есть выполнение одного и того же действия дважды дало разные результаты. Я знаю, что плагин ZonalStats в QGIS работает, поэтому я ищу способ автоматизации ZonalStats.
Томас
@vinayan У меня есть код, который вы дали для зональной статистики, но он создает столбцы в векторном слое многоугольника, но не обновляет вычисленные значения. Почему это так?
user99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

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

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

zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1, QgsZonalStatistics.Mean)
zoneStat.calculateStatistics(None)

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

Фицрой Хогсфлеш
источник
Может ли кто-нибудь помочь с синтаксисом для одновременного получения двух статистических данных, скажем, Min & Max? Я пробовал разные способы, но безуспешно
Dorakiara
В Qgis 3 вам нужно заменить путь к растровому файлу самим растровым файлом! Следовательно, rasterFilePath = 'F: /temp/zonalstat/raster1.tif' становится: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Затем вы меняете rasterFilePath на rasterFile в zoneStat. команда zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (None)
philsch