Використовуєте плагін 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)

Чудово. Дуже дякую, виняян, саме так я і пішов.
Томас

Також дивіться тут альтернативне рішення з використанням R
Thomas

рада, що тобі допомогло!
vinayan

@vinayan QProgressDialog корисний для візуальних середовищ, де ви хочете побачити, наскільки прогресували розрахунки. Він не використовує командного рядка. Ви можете використовувати Noneяк параметр, і він прекрасно працює. Тоді вам не потрібно від PyQt4..лінії чи 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)

за замовчуванням обчислює лише кількість, суму та середнє значення (як ви можете сказати з 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 в зоніStat команда zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (None)
філш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.