Så, jag har en katalog med ganska många rasterfiler i TIFF format som är höjddata från ASTER V3, vilket är ungefär 30 meters data (latitud). Jag har data som täcker hela Europa och en indexfil som kan användas för att läsa in bara de data jag för tillfället behöver med en ”action”.
Detta är lite omständligt och även om det inte är speciellt svårt så tar det lite extra tid att läsa in index, använda verktyget och läsa in data. Det blir några extra steg jämfört med att bara lägga till ett enda lager…
Jag har inte byggt ihop dessa data till ett enda GeoPackage tidigare eftersom QGIS vägrat generera den virtuella rasterfil som jag behövde för att exportera ut lagret till ett GeoPackage. Exporten av raster använder GDAL_TRANSLATE, som vad jag förstår bara kan ta en indatafil och skapa en utdatafil, därav virtuella raster.
Men med GDAL är detta inte enda möjligheten att skapa ett sammanhängande raster av flera liknande filer. Det finns även ett Pythonverktyg som levereras med GDAL som heter gdal_merge.py. Detta kan skriva till valfritt format och kan ta hur många filer som helst (typ) som indata.
Detta fungerar utmärkt från kommandoprompten, och när jag nu hittat vad jag var ute efter så började jag leta lite även i QGIS och självklart! Där var den. Under ”Raster miscellaneous” så finns verktyget ”Merge”. Gränssnittet i QGIS har däremot lite problem att hantera så många filer som det är tal om, och det händer att programmet hänger sig, så det är bra att veta att teminalkommandot också finns där. QGIS har antagligen inte alls hängt sig utan jobbar på i bakgrunden med kommandot, men då kommandot inte berättar det för QGIS så får man efter ett tag upp meddelande om att programmet inte svarar.
Kommandot behöver förutom namn på utdata även ett format specificerat, ”-o utdata.gpkg -of GPKG”. Indata kan använda wildecard så *.tif från rätt katalog räcker i det här fallet.
gdal_merge.py -o utdata.gpkg -of GPKG *.tif
När kommandot är givet är det bara att luta sig tillbaka och vänta… Det är trots allt 1853 filer som skall kombineras till en sammanhängande rasterbild. Då det dessutom är ett Pythonskript och inte ”native” C++ och inte heller optimerat för flera trådar så är det bara datorns klockfrekvens som avgör hur fort detta går. Jag är inte så säker på att mina Pythonkunskaper räcker för att skriva om skriptet till en flertrådsvariant, men det spelar inte säkert någon roll då resultatet är en enda GPKG fil. Dessa är inte byggda för att kunna hanteras på ett sätt som innebär att det skrivs till dem från flera håll. Något som är positivt är att det bara är en terminal och ganska begränsade resurser som är upptagna och det finns gott om datorkraft att arbeta med för andra uppgifter. Beräkningen tog precis under en timme, vilket jag faktiskt tycker är överraskande bra med tanke på omständigheterna. Hastigheten beror såklart på den dator man använder och min är inte direkt långsam…
Nu är inte denna typ av data optimal för exempelvis overviews (pyramider), men för att snabba upp hanteringen i QGIS så underlättar det. Dessa byggs antingen via QGIS och Build overviews även detta verktyg i Raster menyn. Eller med GDALADDO kommandot från terminalen.
gdaladdo -r average utdata.gpkg 2 4 8 16 32 64 128
Jag är inte säker på att ”average” är det bästa för den här typen av data, men det ser snyggast ut i kartan. Standard är ”nearest” eller närmsta granne och detta går mycket fortare, men åtminstone för andra typer av data så skapar detta inte snygga pyramider. För analyser så spelar pyramiderna mindre roll (utgår jag ifrån) då de faktiska data används i dessa fall.
Nivåerna väljer jag lite godtyckligt och ju större raster desto fler nivåer krävs för att det skall ritas ut snabbt på skärmen. I det här fallet så är det en gigantisk mängd pixlar, så jag drar till med nivåer upp till 128.
Detta är inte ett Pythonskript utan ett C++ kompilerat kommando, vilket integrerar bättre med QGIS, men det fungerar lika bra att köra från terminalen här också. I jämförelse med gdal_merge så började kommandot tuffa på ganska raskt, men ju fler och större nivåer som behövde beräknas så blev det tröttare och tröttare. I slutändan så tog det här kommandot runt 2 timmar, men det varierar säkert med exempelvis vilka nivåer man använder.
Resultatet då?
Ja datakvalitén är den samma som tidigare, men möjligheten att använda samma data för allt från kontinental zoomnivå till ganska detaljerade topografiska kartor utan att behöva göra något annat än att lägga till ett enda lager… Det är helt klart värt tiden det tog att generera detta paket med data.
De 1’853 TIFF filerna är tillsammans 26 Gb medan GeoPackage filen med pyramider är 15.7 Gb, vilket med tanke på inbyggd komprimering och standardinställningar för de verktyg som använts är ganska normalt.
En erfarenhet av att arbeta med mycket data i QGIS är att kommunikationen mellan många av de inbyggda verktygen och gränssnittet måste bli bättre. Bara för att QGIS inte får något livstecken från en inbyggd process så behöver det inte betyda att något är fel. Det kanske bara tar lite längre tid. Men om så är fallet är omöjligt för mig som användare att veta, så antingen väntar jag snällt. Eller så kör jag processerna från terminalen.