Virtuella lager har nu funnits ett tag och för normala användare så kan det vara svårt att se alla fördelar med dessa lager. Detta inlägg är inte heltäckande, men jag skall försöka belysa en del av de många fördelarna som faktiskt gör QGIS väldigt kraftigt jämfört med ”andra GIS-program”.
Tänk dig att du har ett vektorlager, i shape, GeoPackage eller PostGIS, med massor av typer av information. Jag använder Lantmäteriets lager för markyta i skala 1:1M. Du är däremot bara intresserad av tätorterna, eller rättare sagt tätorter med buffert på 2000 meter.
”Inga problem! Först så gör du ett attributurval och sparar det som ett nytt vektorlager. Sedan skapar du ett buffertlager med verktyget för buffert.”
Det skall alltså skapas två nya lager, med en hel del knapptryckningar och musklick på vägen.
”Går det inte att göra allt i ett enda steg, och utan att skapa några nya lager?”
Jovisst! Med QGIS virtuella lager.
När man klickar på knappen ”Add/Edit Virtual Layer” så kommer ett dialogfönster upp. Där kan man fylla i ett önskat lagernamn och sedan är det bara att skriva in en urvalsfråga.
Här använder jag ”vanlig” SQL, med kommandot ”st_buffer”.
Select startar kommandot och därefter så anger man vad som skall returneras. I det här fallet är det enbart en 2000 enheters buffert på geometrin, men om man även vill ta med attributkolumner så får man lägga till dessa kommaseparerat här.
Vilka geometrier som skall väljas anges med from och ett tabellnamn. Vill man sedan inte att alla geometrier i lagret skall bearbetas så gör man ett urval med where.
Resultatet blir ett sammanslaget (dissolve) vektorlager med polygoner utsträckta med 2000 meter runt alla tätorter i originallagret. Allt utan att några nya filer har skapats. Med andra ord, om någon ändrar i källfilen (ny stad, ny stadsdel, etc) så kommer det virtuella lagret att ändras automatiskt!
Nu är det ju inte helt enkelt att hålla alla kommandon och inställningar för ”ST” kommandon i huvudet, och det finns ganska begränsad hjälp inbyggt i QGIS. Men här kommer några exempel på kommandon:
st_convexHull – minsta polygon som omsluter alla valda geometrier.
st_centroid – centrumpunkten för polygoner
Det finns även st-kommandon som är bättre lämpade att använda för urval, som exempelvis:
st_contains – finns en geometri inom en annan
st_intersects – överlappar två geometrier varandra
st_distance – avståndet mellan två geometrier
Det finns massor med st-kommandon och alla går inte att tillämpa i QGIS. Det finns vad jag hittat inte heller en bra guide för hur man använder dessa st-kommandon tillsammans med virtuella lager. Just st_buffer var ganska enkel då det är en vanlig funktion som det inte tog allt för mycket tid att komma på rätt spår med, men de övriga har jag haft lite blandad framgång med. Det är SQLite/SpatiaLite som är grunden, så om dessa har stöd för kommandot, så bör det fungera även i QGIS Virtuella lager.
För några kommandon så har jag lyckats ”hänga” QGIS, så spara ofta om du skall prova. Jag tror kanske inte att det är så att programmet hängt sig så mycket som att några av mina testkommandon har varit väldigt beräkningsintensiva, och det verkar som att endast en CPU kärna har använts åt gången för bearbetningen.
Jag kan ta ett praktiskt exempel till som jag testat. Ett punktlager med adresser där jag vill veta vilka som finns inom tätbebyggt område, vilket jag har en polygon för från ett annat lager. Då blir kommandot:
select * from adresser a, tatbebyggt b where st_within(a.geometry, b.geometry)
Just detta kommando blir lite långsamt (minst sagt), så det är inte alla typer av SQL kommandon som är lämpliga för virtuella lager.
Om det är någon som känner till en bra källa där olika SQL kommandon för QGIS (eller SQLite/Spatialite) som man kan använda för att lära sig mer om dessa kraftfulla verktyg så skriv en kommentar! Utan instruktion eller handledning så blir tillgängligheten på detta potentiellt väldigt bra verktyg, något begränsad.
Men i praktiken så kommer de flesta av oss inte använda dessa lite mera avancerade funktionerna med virtuella lager. Bara att kunna skapa ett lager som bara består av tätorter utan att skapa nya filer är i mitt tycke en jättevinst!
select * from my_riks where KATEGORI = "Tätort"
Har du tittat i den officiella dokumentationen för SpatiaLite? http://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html