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:
Ele é um raster 6x10 que ocupa 600 bytes de espaço em disco.
Este é o outro raster:
13x20 e ocupa 1.36KB de espaço em disco.
Os dois rasters lado-a-lado:
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:
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.
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.
No entanto, a ferramenta “Merge” encontrada no menu de cima, em Raster, Miscellaneous (Diversos), é simples de usar e funcionou bem para mim.
O raster resultante fica:
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:
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”.
O resultado é visualmente muito parecido com o mosaico feito com a ferramenta Merge:
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:
…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.