Detta var tänkt att bli en guide för hur man ”enkelt” kan skapa och använda vektordata i tiles med GeoPackage i QGIS…
Spoiler alert! Det är långt ifrån enkelt!
För det första. Om du söker på Internet så är det extremt svårt att hitta en källa som beskriver hur man hanterar, och framför allt skapar, vektortiles. Jag har inte lyckats hitta en enda bra källa, utan har fått plocka information från olika källor som varit bättre eller sämre på att beskriva tillvägagångssättet.
Om du begränsar dig till OpenStreetMap data och kanske till och med bara kör via MapBox, så är det möjligt att det blir enklare. Men jag är inte intresserad av det. Jag vill ta egna vektordata och konvertera dessa till ett paket med vektortiles och använda dessa i QGIS, samt på mobila enheter med exempelvis QField. Men QGIS till att börja med.
Det finns ett verktyg i QGIS 3.14 som skapar mbtiles från lager i QGIS, men man har inte speciellt mycket kontroll här, så i detta inlägg tittar jag efter andra verktyg.
Det finns ett verktyg kallat MapTiler som finns i en gratisversion, men denna är begränsad till det extrema och tillåter endast 1’000 objekt, vilket är löjligt lite. Vill du ha möjlighet att konvertera obegränsat antal objekt kostar det 3’450 dollar för en licens…
Det enklaste sätt jag hittat att skapa vektortiles utanför QGIS är i flera steg. Först så gör man om data till GeoJSON.
ogr2ogr målfil.geojson källfil.shp -t_SRS EPSG:4326
Om man använder GDAL så kan man göra det med ogr2ogr i ett steg (se ovan) där man även konverterar koordinatsystemet till WGS-84, vilket är nödvändigt för processen och standard för GeoJSON.
Sedan använder man ett MapBox-verktyg vid namn Tippecanoe för att konvertera GeoJSON till mbtiles format med vektortiles.
tippecanoe -zg -o målfil.mbtiles källfil.geojson
Tippecanoe har mängder av inställningar för att styra resultatet och kommandot ovan ”gissar” många av dessa mer eller mindre bra. Resultatet är dock ett till synes fullt fungerande vektortiles paket. I exemplet ovan har jag använt det rekommenderade alternativet -zg, men detta ställde till med lite oväntade resultat med de data jag testade, så kontrollera manualen (man tippecanoe) om du upplever problem.
Resultatet är inte ett GeoPackage, även om mbtiles också är baserat på sqlite. Nåja, jag kan nöja mig med mbtiles tills vidare.
Nästa steg blir att öppna paketet i QGIS.
Nu har jag originalfilen i shape, GeoJSON filen och mbtiles. Jag har även testat med ett GeoPackage som jämförelse, men det kan vi lämna därhän i detta inlägg.
Shapefilen tar upp 19,8 Mb på disken. GeoJSON är 51,2 Mb och mbtiles 5,4 Mb. Bara detta är ett tecken på att vektortiles är synnerligen effektivt i jämförelse för lagring av data. Men det har ett pris i bland annat geografisk noggrannhet…
En senare jämförelse med valda lager ur terrängkartan över Jönköpings län där lärdomar från dessa experiment appliceras visade: Shape 459,7 Mb, GeoJSON 1.1 Gb och mbtiles 151,8 Mb.
Notera att det finns två mbtiles lager i datakällor. Ett identifieras som just ”tiles” medan ett visas som traditionellt vektorlager. Detta är samma datakälla, men de beter sig helt olika i QGIS.
Med det traditionella lagret så visas rutornas utsträckningen tydligt.
Med tiles-lagret så visas inte tilegränserna, och dessa blir därmed inte ett problem vid stilsättningen.
Jamen då så? Litet på disken och inga tiles-kanter att hantera i stilen, vad är problemet.
Här är ett av problemen:
Ett paket med vektortiles kan innehålla såväl punkter, linjer som ytor och jag börjar med ett lager. Flera samtidiga ”vektorlager” i ett paket med de verktygen jag använder här tar vi lite senare, men det är inte det som var problemet. Nej, problemet initialt var hur jag kan dela upp polygonlagret i klasser som kan stilsättas individuellt.
I filterkolumnen så kan man manuellt skriva in ett filteruttryck, men det blir bara gissningar hur detta skall göras. Jag vet att exempelvis territoriellt hav har KKOD värde ”1”, vilket skulle drista mig att testa ”KKOD” = 1 som filter.
Vilket också visade sig vara korrekt, men bara efter det att jag manuellt angett namnet på originallagret också (något som inte framgår någonstans i tile paketet). Lite bättre stöd vid utformningen av filter och hur urvalet kan göras med lager och filter hade varit önskvärt.
Flera lager då.
Det var faktiskt inte svårare än att lägga till flera GeoJSON filer efter varandra i kommandot med Tippecanoe.
Då skrevs de olika lagren till olika namngivna lager i paketet. Det fungerar även att använda ”wildcard” som exempelvis *.geojson för att lägga till alla filer av typen geojson i ett paket.
Nu kan man bygga upp symbologin med lager och filter, men det är inte lika enkelt och överskådligt som när man lägger till lager från exempelvis ett GeoPackage. Man får inte speciellt mycket hjälp, och när man exempelvis vill skapa etiketter så måste man själv skriva in uttrycket eller fältnamnet man vill använda som källa för etiketterna. Det fungerar inte att använda drop-down listan. Jag har heller inte riktigt listat ut hur, eller ens om, man kan spara skapad stil med tile-paketet.
Är det ok i övrigt?
Nja. När man granskar de data som presenteras så saknas det ganska mycket jämfört med källfilerna. Någonstans på vägen har dessa data försvunnit. Dessutom varierar det i olika skalor vilka data som är borta.
Ovan visas en jämförelse mellan vägar i mbtiles (grönt) och shape (rött). Som synes så är det inte bara sträckor där det saknas data för vektortiles, utan förenklingen av data har dessutom gjort att sträckningen inte längre överensstämmer. Som det skulle visa sig så var det mycket riktigt en inställning som ”plockade bort” data för tiles som innehöll lite för mycket för att bli effektivt i vissa zoomintervall. Men den avvikande geometrin hittade jag ingen förklaring till direkt, annat än att det också sannolikt beror på något förenklingssteg.
Skillnader i geometri gäller inte bara vägar. I bilden ovan har jag även lagt in kantlinjen för polygonlagret my_riks från shapefilen. I praktiken så blir skillnaden tydlig först när man zoomar in väldigt mycket, så för presentationer på skärm som bakgrundskarta, så är det kanske inte ett problem. Det skulle visa sig att även detta är en effekt av effektiviseringen. När man väljer zoom-intervall för paketet, så anpassas data efter vad som är rimligt att se på skärmen i form av geografisk noggrannhet. För mindre skalor så betyder det att man kan reducera koordinaternas komplexitet enormt genom att avrunda x- och y-koordinaterna. Detta visas som ovan tydligt när man zoomar in förbi den avsedda max-nivån. Planerar man väl och begränsar visningen till ”rätt” intervall, så kommer man inte direkt att se detta med blotta ögat.
Jag tror jag avbryter mina tester här.
Slutsatser
Det är fortfarande en bit kvar innan vektortiles är fullt moget att användas i exempelvis QGIS på ett naturligt sätt. Mycket av mina problem i dessa tester handlar om brister i tydlig dokumentation och att man får så lite hjälp av verktygen när man försöker använda dem.
Om man läser allt i manualfiler och liknande så kan man undvika många fallgropar, men ett väldesignat gränssnitt för verktygen hade gjort det snabbare och enklare för betydligt fler att börja använda vektortiles i olika sammanhang.
Att det inte finns något enkelt OpenSource-verktyg som direkt konverterar vektordata till vektortiles, exempelvis via GDAL/OGR, är en brist. Att man efter konverteringen heller inte är ens halvvägs eftersom stilsättningen är så annorlunda är också ett problem. Här har jag dessutom bara berört stilsättning i QGIS, vilket inte är samma sak som för webben.
Ja, jag vet att QGIS har ett verktyg som gör mycket av det jag fått göra manuellt, men som jag nämnde i inledningen så har man inte speciellt mycket kontroll över det som verktyget gör. Inte minst när man kikar på alla inställningar man kan göra i Tippecanoe. För den som snabbt vill ha lite vektortiles är dock verktyget i QGIS den väg som jag skulle rekommendera just nu.
Jag hade även gärna sett vektortiles i GeoPackage, men den standarden är väldigt ny och jag känner inte till några tillgängliga verktyg som hanterar detta (MapTiler anger på sin webbsida att de kan det).
Den dag jag kan arbeta med vektordata som vanligt i QGIS (PostGIS/GeoPackage) och sedan klicka på ”paketera vektortiles” för att bygga ett paket i mbtiles eller GeoPackage, inklusive stilsättning som kan användas mobilt och på webben kanske inte är väldigt långt borta, men vi är inte där än.