Como calcular o número de células com um determinado valor?

11

Eu tenho um arquivo raster em que todas as células têm valores entre -3 e 7, nenhum valor de dados é -9999. Como posso calcular o número de células com um valor específico, por exemplo, 6? Posso usar a calculadora?

Astrid
fonte

Respostas:

16

Duas maneiras fáceis possíveis:
1.)

  • Instale a calculadora raster QGIS se ela ainda não estiver disponível (você não especificou qual versão QGIS você está usando)
  • Use a calculadora raster QGIS com uma fórmula como esta "Corine@1" = 23. Isso extrairá todas as células com valor 23 em uma nova varredura
  • Em seguida, use a ferramenta "Estatísticas da camada de varredura" na caixa de ferramentas SEXTANTE do QGIS para calcular a soma total de células.

insira a descrição da imagem aqui

2.) Se você quiser uma visão geral mais sofisticada sobre o número de células rasterizadas, poderá usar o plug-in LecoS para QGIS.

  • Verifique se você instalou o Numpy, Scipy e PIL no seu computador. Encontre instruções sobre como fazê-lo no Windows no meu blog ou aqui .
  • Faça o download do LecoS no instalador do Plugin e ative-o. Nenhum erro deve aparecer.
  • Execute a ferramenta de estatísticas Landcover (Menu Raster -> Landscape Ecology -> Landcover statistics) com sua forma raster. Verifique se a sua forma tem uma projeção correta, um valor definido sem dados e também células quadriculares.
  • Escolha as opções conforme exibido abaixo. Você pode salvar os resultados em um arquivo .csv. As saídas contêm a cobertura total (cellnumber * raster cellize ^ 2) para todas as suas classes de cobertura terrestre. insira a descrição da imagem aqui
Maçarico
fonte
1
Só para observar que atualmente a caixa de ferramentas é chamada de Processamento .
Luís de Sousa
9

EDIT 3 : Converti o código abaixo em um script SEXTANTE bastante utilizável que fornece a seguinte saída: insira a descrição da imagem aqui

Instruções detalhadas e o link para download podem ser encontrados aqui .


Você pode usar o console python para esta tarefa. Copie o código fornecido abaixo, cole-o em um arquivo de texto e salve-o como "some_script.py", por exemplo. Da próxima vez que você precisar contar os valores das células, abra o console python no QGIS, pressione o botão 'show editor' e abra esse script lá. Em seguida, substitua 'raster_path' na quarta linha do script pelo caminho real da sua varredura e salve as alterações. Em seguida, execute o script e na saída do console (à esquerda do editor na captura de tela abaixo), você verá o número de células para cada valor que você possui na varredura.

Observe que você precisará ter o python-numpy instalado para que esse script funcione.

EDIT: Além disso, se você não precisar de valores exatos, mas preferir ver a distribuição de valores, use a abordagem descrita aqui .

EDIT 2: versão mais avançada do script fornecida. Agora ele trabalha com rasters multibandas e processa valores de NaN.

from osgeo import gdal
import sys
import math

path = "raster_path"

gdalData = gdal.Open(path)
if gdalData is None:
  sys.exit( "ERROR: can't open raster" )

# get width and heights of the raster
xsize = gdalData.RasterXSize
ysize = gdalData.RasterYSize

# get number of bands
bands = gdalData.RasterCount

# process the raster
for i in xrange(1, bands + 1):
  band_i = gdalData.GetRasterBand(i)
  raster = band_i.ReadAsArray()

  # create dictionary for unique values count
  count = {}

  # count unique values for the given band
  for col in range( xsize ):
    for row in range( ysize ):
      cell_value = raster[row, col]

      # check if cell_value is NaN
      if math.isnan(cell_value):
        cell_value = 'Null'

      # add cell_value to dictionary
      try:
        count[cell_value] += 1
      except:
        count[cell_value] = 1

  # print results sorted by cell_value
  for key in sorted(count.iterkeys()):
    print "band #%s - %s: %s" %(i, key, count[key])

insira a descrição da imagem aqui

SS_Rebelious
fonte
Na verdade, é muito mais fácil do que usar um loop. Você pode obter as contagens diretamente usando numpy : count = dict(zip(*numpy.unique(a, return_counts=True))). Pode ser necessário garantir que você esteja executando o Python de 64 bits para evitar erros de memória. Embora eu não tenha testado como isso lida NaN.
Jpmc26