Como calcular estatísticas de varredura para polígonos?

14

como posso calcular somas, médias etc. de pontos de varredura (multibanda) por polígono de uma camada vetorial. Foi-me dito que isso é chamado de "estatística zonal". Eu tentei isso com o QGIS primeiro.

Existe uma maneira de fazer isso, mas isso é muito lento (converter raster em vetor, cruzar com a segunda camada vetorial, calcular geometria, exportar números, calcular estatísticas com planilha ou outro programa, reimportar os resultados, levar uma eternidade para o meu 350.000 pontos de varredura).

Também me deram a dica de usar saga-gis. Isso possui "estatísticas zonais", mas são baseadas em categorias de uma banda raster, e não em polígonos de uma camada vetorial. Então, para usar isso, eu teria que converter minha camada vetorial em varredura e calcular as estatísticas.

Esta parece ser a maneira errada de resolver isso. Não haveria como contabilizar pontos de varredura que pertencem a 2 ou mais polígonos porque eles são cruzados pelo limite do polígono. Eu suponho que as estatísticas baseadas em polígonos sejam capazes de lidar com isso, então eu também assumo que eu não encontrei o módulo correto ainda.

Saga-gis tem realmente muitos módulos. Informe-me qual é o caminho certo para esta aplicação.

stn
fonte
Estou tentando a solução de Rudivonstaden e as seguintes mensagens de erro aparecem quando eu insiro os dois últimos comandos: >>> zonalstats = qgis.analysis.QgsZonalStatistics (camada de vetor, arquivo de varredura) Traceback (última chamada por último): Arquivo "<input>" , linha 1, em <module> AttributeError: o objeto 'module' não possui atributo 'analysis' >>> zonalstats.calculateStatistics (None) Traceback (última chamada mais recente): arquivo "<input>", linha 1, no <module > NameError: name 'zonalstats' não está definido. Gostaria de saber se os comandos estão corretos ou se o arquivo raster que estou usando está no formato correto? Obrigado!
Dan Wolf
Oi Dan. Stackexchange funciona um pouco diferente de um fórum. O objetivo é ter uma interação do tipo perguntas e respostas, em vez de uma discussão em andamento. Se as respostas para a pergunta original não resolverem o que você precisa saber, peça esclarecimentos na seção de comentários ou considere fazer uma nova pergunta.
Jay Guarneri
Obrigado pelo seu comentário, Dan. Minha resposta estava faltando uma declaração de importação necessária, que agora deve ser corrigida.
Rudivonstaden 26/03

Respostas:

22

Eu estava lutando para fazer exatamente a mesma coisa, mas por várias razões, estou comprometido em usar o QGIS. Tentei usar o v.rast.stats usando o plug-in GRASS e também através do plug-in Sextante. A última abordagem falhou, porque parece anexar as estatísticas a uma camada vetorial temporária que ela exclui. O plugin GRASS funcionou, mas não lida com polígonos sobrepostos.

Depois de pesquisar um pouco (na fonte do plug-in ZonalStats com som promissor), descobri que o QGIS realmente tem métodos estatísticos zonais incorporados à API, e eles também têm ligações Python. Então, enquanto você está apenas procurando count, sume meanas estatísticas para as características do polígono, o Console Python (Plugins> Python Console) é atualmente a maneira mais fácil de anexar as estatísticas para a tabela de atributos polígono.

  1. Selecione sua camada de varredura no sumário e digite o seguinte no console (ele pega o nome do arquivo de origem da camada de varredura)

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

  2. Selecione sua camada vetorial e execute o seguinte comando no console (ele pega a própria camada vetorial)

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

  3. Execute os três comandos a seguir no console (eles passam a camada vetorial e o arquivo raster para a calculadora de estatísticas zonais do QGIS)

    >>> import qgis.analysis

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

    >>> zonalstats.calculateStatistics(None)

Os resultados serão anexados como campos extras na camada de polígono.

Estatísticas Zonais

Observe que, se você desejar anexar um prefixo aos novos campos (em vez de apenas tê-los como soma, média e contagem), substitua o primeiro comando na etapa 3 pelo seguinte (supondo que você queira usar 'zonal_' como o prefixo:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")
rudivonstaden
fonte
1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron
Há o plugin Zonal Statistics no QGIS, portanto, provavelmente não é necessário executar os comandos mencionados por você: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Gostaria de saber por que não há possibilidade de calcular o máximo e o mínimo valores também.
matandked
Eu usei sua técnica, mas ela exclui alguns polígonos :(
niahoo 14/04
6

Finalmente encontrei: No Saga-GIS, abra categorias-polígonos e grade de dados e, em seguida, forma-> grade-> valor da grade-> estatísticas da grade para polígonos

stn
fonte
3

Esse problema parece já ter sido resolvido há algum tempo, mas vou adicionar minha colher à sopa, pois recentemente precisei de algumas estatísticas de varredura.

A metodologia QGIS descrita por rudivonstaden funcionou como um encanto, obrigado pela dica. No entanto, no meu caso, eu também queria saber os valores min & max e std para os valores raster dentro dos meus polígonos, e essa funcionalidade que não consegui encontrar no QGIS. Encontrei uma solução através da função isectpolyrst no GME , que é o meu favorito para resolver problemas de GIS. Essa função me deu apenas as estatísticas de que eu precisava e muito rapidamente também.

PS. O GME tem um pouco de dependência infeliz (ArcGIS). Portanto, mesmo que o programa em si esteja disponível gratuitamente para todos, você precisa do ArcGIS para executá-lo. Mas se você possui ArcGIS (qualquer nível de licença), eu recomendo que você experimente.

EDITAR:

Consegui as estatísticas que queria, mas depois descobri que tirei conclusões precipitadas depois de analisar os números reais. Você obtém estatísticas, sim, mas apenas para a primeira banda em uma varredura. Portanto, se você operar com uma imagem rasterizada de 3 bandas, as estatísticas estarão incompletas. Eu deveria ter apontado o número de canais na minha postagem original. É melhor usar o SAGA-GIS como o stn proposto acima, se você estiver trabalhando com imagens raster multibanda.

GISinHelsinki
fonte
3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.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:

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

consulte API para todas as opções.

Fitzroy Hogsflesh
fonte