Usando uma camada virtual em vez de mosaicar rasters no QGIS

Colegas pesquisadores e entusiastas de GIS de código livre,

Bem-vindos ao meu blog!

Eu gostaria de começar com um aviso – posso ser uma pesquisadora dessa área, mas isso não significa que tudo o que faço ou escrevo aqui funcionará para você, em suas próprias configurações de desktop e versões de pacotes. Me eximo de responsabilidade se você perder dados ou estragar a sua instalação. Também não autorizo ​​nenhum tipo de cópia do meu conteúdo.

Hoje, estou apresentando a criação de uma camada virtual como uma alternativa ao processo de mosaicar rasters.

Mas por que alguém preferiria juntar os rasters em uma camada virtual em vez de, de fato, uni-los?

Bem, a principal razão é que um arquivo de layer virtual ocupa muito menos espaço no disco rígido do que um mosaico raster. Se os meus rasters tiverem cada um 80 KB, isso não é um problema. Mas e se eles tiverem 1 GB cada?

Na verdade, foi trabalhando com arquivos ligados à minha tese de doutorado que eu me dei conta disso.

Exemplo

Os procedimentos descritos aqui foram realizados no QGIS 3.26 “Buenos Aires”.

Como exemplo, gerei dois rasters, localizados lado a lado, com valores aleatórios entre 0 e 10.

Os rasters

Este é um deles:

A random raster

Ele é um raster 6x10 que ocupa 600 bytes de espaço em disco.

Este é o outro raster:

A random raster

13x20 e ocupa 1.36KB de espaço em disco.

Os dois rasters lado-a-lado:

Two random rasters side-by-side

O segundo raster tem um tamanho de pixel (5000) que é metade do tamanho dos pixels do primeiro raster (10000). Eles também estão levemente desalinhados.

Exemplo de operação a ser feita

Agora, eu quero fazer algum tipo de processamento que envolva os dois rasters. Pode ser calcular estatísticas zonais nesta região definida por um polígono de 20 lados:

Two random rasters side-by-side and a 20-side polygon

Mas, na janela do algoritmo Zonal Statistics (Estatística Zonal), noto que há lugar para apenas uma entrada, e eu quero que as estatísticas sejam calculadas para toda a região do polígono, abrangendo partes de ambos os rasters.

zonal statistics in QGIS

Então, sim, precisamos fazer mosaico raster! Ou uma camada virtual…

Mosaicando rasters no QGIS

Esta é a minha experiência com mosaico de rasters nesta versão do QGIS (3.26.2). Não consegui fazer com que os algoritmos i.image.mosaic do GRASS GIS e Mosaicking do SAGA GIS funcionassem sem problemas para os meus rasters, através do QGIS.

issue encountered in mosaicking tool

No entanto, a ferramenta “Merge” encontrada no menu de cima, em Raster, Miscellaneous (Diversos), é simples de usar e funcionou bem para mim.

Merge raster tool on QGIS

O raster resultante fica:

Two random rasters side-by-side

Podemos notar que os rasters, antes levemente desalinhados, agora estão perfeitamente alinhados.

Se isso é bom ou ruim, depende da aplicação. Um pequeno desvio na localização pode ser aceito por causa do alinhamento, ou isso terá consequências não previstas?

Como esses são rasters aleatórios gerados como exemplo, neste caso, vou aceitar que, quando eles ssão unidos, o segundo raster “se move” um pouco.

Outro aspecto a ser observado: no mosaico raster, o tamanho do pixel é fixado como o do raster com maior definição.

Isso pode ser observado nas propriedades do raster gerado:

Merge raster tool on QGIS - result

Construindo camadas virtuais

Acima, nós vimos como mosaicar rasters. Mas este post não era sobre como NÃO mosaicar rasters?

Sim. Vamos lá!

Na caixa de ferramentas de processamento, procure a ferramenta GDAL “Build Virtual Raster” ou “Construir Raster Virtual” (ID do algoritmo: gdal:buildvirtualraster).

Selecione os rasters de entrada e a resolução como “Highest” ou “Maior”.

Build Virtual Layer QGIS

O resultado é visualmente muito parecido com o mosaico feito com a ferramenta Merge:

Two random rasters side-by-side

Neste caso, os rasters também foram alinhados automaticamente e o tamanho de pixel resultante é 5000.

ATENÇÃO: A camada virtual simplesmente referencia os rasters .tif para fins de visualização, ou para facilidade de geoprocessamento. Se os arquivos raster originais forem excluídos, a camada virtual deixará de funcionar!

Uso de espaço físico

O raster resultante gerado a partir do mosaico com o algoritmo Merge resultou em um arquivo de saída de 2,30 KB.

O arquivo raster virtual “.vrt” usa 1,80 KB, economizando espaço no disco rígido.

Quando eu abro o arquivo da camada virtual, vejo isso:

<VRTDataset rasterXSize="25" rasterYSize="20">
  <SRS dataAxisToSRSAxisMapping="1,2">PROJCS["WGS 84 / UTM zone 22S",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-51],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",10000000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32722"]]</SRS>
  <GeoTransform>  3.2483565110000002e+05,  5.0000000000000000e+03,  0.0000000000000000e+00,  6.8163052139999997e+06,  0.0000000000000000e+00, -5.0000000000000000e+03</GeoTransform>
  <VRTRasterBand dataType="Float32" band="1">
    <ColorInterp>Gray</ColorInterp>
    <SimpleSource resampling="nearest">
      <SourceFilename relativeToVRT="1">raster_test_2.tif</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="13" RasterYSize="20" DataType="Float32" BlockXSize="13" BlockYSize="20" />
      <SrcRect xOff="0" yOff="0" xSize="12.9451556" ySize="19.9483487200001" />
      <DstRect xOff="12.0548444" yOff="0.0516512799998745" xSize="12.9451556" ySize="19.9483487200001" />
    </SimpleSource>
    <SimpleSource resampling="nearest">
      <SourceFilename relativeToVRT="1">raster_test.tif</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="6" RasterYSize="10" DataType="Float32" BlockXSize="6" BlockYSize="10" />
      <SrcRect xOff="0" yOff="0" xSize="6" ySize="10" />
      <DstRect xOff="0" yOff="0" xSize="12" ySize="20" />
    </SimpleSource>
  </VRTRasterBand>
</VRTDataset>

Mostrando que a camada virtual carrega os rasters .tif e os exibe como uma única camada. O tamanho do arquivo .vrt parece ser mais dependente do número de arquivos raster que compõem a camada virtual do que do tamanho das camadas originais.

Estatística Zonal

Executei o algoritmo Zonal Statistics para ambas as camadas, Virtual, e gerada pelo Merge. Exatamente os mesmos resultados foram gerados:

Zonal statistics on QGIS - results

…o que é ótimo!

As camadas virtuais são adequadas para substituir o processo de mosaicar rasters, para a maior parte das aplicações.

Extras

  • Quando você sugeriria NÃO usar Camadas Virtuais?

Se seus dados são movidos ou recriados constantemente com diferentes propriedades, a camada virtual pode falhar ao carregar um ou mais rasters que a compõem.

Além disso, se você precisar da camada resultante em um arquivo .tif para alguma aplicação, por exemplo, para trabalhar com ela no Python, não sugiro fazer uma camada virtual, pois não irá gerar o arquivo necessário.

  • Por que você precisaria visualizar dois ou mais rasters juntos? E por que não simplesmente abri-los ao mesmo tempo em seu projeto QGIS?

Talvez eu precise fazer alguns cálculos também, como Estatísticas Zonais, exemplificadas neste post. Neste caso, ter dois arquivos abertos ao mesmo tempo não vai me ajudar.

  • 1,80 KB contra 2,30 KB não é uma grande diferença.

Neste caso, não é, porque os rasters usados ​​são aleatórios, minúsculos, e foram criados apenas para testar. Eu uni dois rasters dos meus dados da pesquisa de doutorado em uma camada virtual, cada um com 188 MB, e o arquivo “.vrt” resultante acabou com 1,98 KB. Nesse caso, economizei muito espaço.

  • Não é óbvio que as camadas virtuais são muito mais leves e que elas são a solução mais evidente para este caso?

Talvez, mas muitas pessoas não sabem que as camadas virtuais podem ser usadas basicamente em qualquer cálculo e estatística no QGIS.

Luísa Vieira Lucchese
Luísa Vieira Lucchese
Pós-doutoranda

Pós-doutoranda na Universidade de Pittsburgh

Relacionados