Usando o QGIS Zonal Stats Plugin do Python Console?

9

Estou usando o plug-in Zonal Stats no QGIS para extrair estatísticas de varredura de polígonos sobrepostos (tenho formatos de distribuição de espécies e desejo extrair dados ambientais de dentro do intervalo de cada espécie). Tenho mais ou menos 300 arquivos dos quais preciso obter dados e, por isso, gostaria de escrever um script para executar no console python, no entanto, sou um novato completo com python e não tenho idéia de como fazer isso.

Thomas
fonte
Chade - sim, é uma pergunta semelhante, mas é mais específica. Ninguém respondeu à outra pergunta; em vez disso, sugeriram outras maneiras de resolver o problema. Eu não sei como excluir o outro post
Thomas
Na outra questão, apontei para você um script r capaz do que você deseja e Sylvester Sneekly o nomeou o método exato em python. Se você não está acostumado a codificar em python ou r, todas as outras dicas não o ajudarão. Você precisa de um script auto-codificado ou de muitos cliques de mouse. Aprenda alguma codificação, tente os exemplos e relate, se algo não funcionar.
Curlew
@ Curlew - O método de Sylvester, embora pareça muito bom, representaria uma enorme curva de aprendizado para mim e não tenho tempo para fazer isso no momento. Agradeço a ajuda de Sylvester, mas não foi a resposta direta que eu estava procurando. Embora eu tivesse a maior parte do código que estava procurando no post mencionado em minha outra pergunta ( gis.stackexchange.com/questions/23203/… ). Se o método de Sylvester é a única maneira de fazer isso em python, talvez eu tenha subestimado o quão difícil seria.
Thomas
@ Curlew - Seu script R realmente funciona, obrigado. A única coisa que ainda tenho que resolver é como anexar os resultados retornados em R ao arquivo .dbf dos meus shapefiles (qualquer ajuda com isso seria muito apreciada).
Thomas

Respostas:

13

O código abaixo funcionou para mim QGis 1.8.0

Você pode modificar isso para acomodar vários arquivos com algum loop.

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
fonte
Ótimo. Muito obrigado vinayan, foi exatamente isso que eu estava procurando.
Thomas
Veja também aqui para solução alternativa usando R
Thomas
feliz que ajudou você!
Vinayan
@vinayan, o QProgressDialog é útil para ambientes visuais em que você deseja ver até que ponto os cálculos progrediram. Não tem uso na linha de comando. Você pode usar Nonecomo parâmetro e funciona bem. Então você não precisa da PyQt4..linha from ou da progressDialog = linha. Veja post semelhante em gis.stackexchange.com/questions/23203/…
rudivonstaden
@rudivonstaden - que faz sentido now..i atualizei a resposta
Vinayan
2

Aqui está uma maneira de obter o que você deseja no SAGA GIS. Provavelmente, essa não é a solução que você deseja, mas funciona. Vou analisar os motivos pelos quais meus plugins falham e atualizá-lo o mais rápido possível.

Instale o SAGA GIS (também deve estar disponível via apt-get ou aptitudbe na sua distribuição linux).

  • Inicie o SAGA, carregue no seu formato Raster e vetorial (Módulos de Menu -> Arquivo -> importação GDAL / OGR). Você pode ver o processo abaixo.
  • Execute o módulo "Estatísticas de grade para polígonos" (Módulos de menu -> Forma -> Grade -> valores de grade). Os valores são adicionados diretamente à tabela. O Diálogo deve ficar assiminsira a descrição da imagem aqui
  • Vá para a guia "Dados" na área de trabalho, clique com o botão direito do mouse na camada vetorial e escolha " Salvar como " para exportar a forma com os atributos adicionados. Você também pode exibir a tabela de atributos via clique direito e clicar na tabela

Isso funciona para o conjunto de dados que você me enviou. Também é possível chamar módulos SAGA no QGIS via SEXTANTE como um processo BATCH. Para isso, basta ativar os módulos SAGA nas opções SEXTANTE.

Maçarico
fonte
obrigado pela sugestão, mas eu já tentei a saga - os resultados produzidos foram inconsistentes, ou seja, fazer a mesma coisa duas vezes deu resultados diferentes. Eu sei que o plugin ZonalStats no QGIS funciona, portanto, estou procurando uma maneira de automatizar o ZonalStats.
Thomas
@vinayan Eu tenho o código que você forneceu para estatísticas zonais, mas está criando as colunas na camada vetorial de polígonos, mas não atualizando os valores calculados. Por que é tão?
User99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

calcula por padrão apenas Contagem, Soma e Média (como você pode ver Raster -> Zonal Statisticsno QGIS Desktop, ele pode fazer muito mais).

Se você, por exemplo, deseja calcular apenas a média que precisa usar:

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

consulte API para todas as opções.

Fitzroy Hogsflesh
fonte
Alguém pode ajudar com a sintaxe para obter duas estatísticas de escolha, digamos Min e Max, ao mesmo tempo? Eu tenho tentado maneiras diferentes, mas sem sucesso
dorakiara
No Qgis 3, você precisa substituir o caminho do arquivo raster pelo próprio arquivo raster! Portanto, rasterFilePath = 'F: /temp/zonalstat/raster1.tif' se torna: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Em seguida, você altera o rasterFilePath para o rasterFile na zonaStat comando zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (Nenhum)
philsch