[Innan du testar själv så bör du läsa hela artikeln eftersom det finns ett fel i QGIS som måste fixas först för att det skall fungera]
För alla i ArcGIS världen så är ”modeller” ett känt begrepp. Det är ett visuellt sätt att kombinera olika verktyg och analyser för att anpassa och skräddarsy bearbetningsprocesser till egna verktyg, eller modeller.
I ArcGIS så kallas det ”modell builder” och i QGIS heter det på svenska ”Grafisk modellbyggare”.
I menyn ”Geobearbetning” kan man hitta en verktygslåda (bild ovan) som, lite beroende på vilka tillägg man har installerat, innehåller en mängd olika mer eller mindre avancerade verktyg.
Dessa kan man köra vart och ett för sig direkt från verktygslådan med dubbelklick, eller som vi skall se här, kombinera dem till en anpassad modell.
Nu blir det inget avancerat, utan ett enkelt svar på frågan ”vilka punkter ligger närmare än 200 meter från en linje?”.
Frågan går att svara på genom att manuellt köra ett par verktyg, men det går också att bygga en modell för det.
Först så definieras två vektorlager som parametrar. Ett för linjer och ett för punkter. Om man vill kunna variera avståndet så är det även nödvändigt att lägga till en numerisk parameter (”number” i bilden ovan).
När det gäller avstånd, ytor och liknande variabler som är beroende av en enhet så måste man tänka till lite i QGIS. Man anger inte enhet, utan enheten är den samma som projektet/lagret. Se därför till att alla data (och projektet) är projicerat i ett system som använder meter (exempelvis SWEREF99TM) om du vill ange avstånd i meter.
Under fliken ”Algoritmer” (bild ovan) så återfinner man alla verktyg från verktygslådan, och dessa kan man dra in i modellen och konfigurera.
Alla modeller i alla verktygslådor är inte helt kompatibla eller anpassade, men det finns flera verktyg som ofta gör samma eller liknande saker, så genom att använda sökfältet så kan man exempelvis leta efter verktyg som skapar en buffert.
I inställningarna för bufferten (QGIS – Vector Geometry Tools) så kan man ange såväl vilket lager som beräkningen skall göras på, som vilket värde som skall användas för avståndet.
Nästa steg skapar ett urval bland punkterna baserat på resultatet av bufferten och slutligen så sparas urvalet till ett nytt lager.
Man kan köra modellen direkt eller spara den och köra den från verktygslådan senare. Filen som skapas kan även delas med andra och det finns ett speciellt verktyg för att lägga till verktyg från fil.
När man kör verktyget (bild ovan) så får man ange vilka lager som skall användas och vilket avstånd som är önskat. Som standard så skapas inga lager utan resultatet lagras i en temporär fil och i mitt exempel så kan du se detta i bilden nedan:
Det går att skapa standardstilar för resultatet och hjälptexter för verktyget väldigt enkelt. Högerklicka på modellen så får du fram lite olika alternativ och hjälpen redigeras i modellverktyget.
PROBLEM!
Då har jag visat hur det borde fungera. Tyvärr så finns det en bugg i ett av de verktyg jag använder (Extract by location) som gör att man hela tiden får felmeddelanden. Det finns en fix på problemet, men den har inte blivit implementerad som standard och om du inte kör den experimentella versionen av QGIS så är det därför inte säkert att du fått del av fixen.
Det är ett fel i ett Pythonskript som finns i filen ”python/plugins/processing/algs/qgis/ftools/ExtractByLocation.py”.
Leta reda på rad 57 (index = vector.spatialindex(layer)) och kontrollera vad som står under denna.
output = self.getOutputFromName(self.OUTPUT) writer = output.getVectorWriter(layer.pendingFields(), layer.dataProvider().geometryType(), layer.crs()) geom = QgsGeometry() selectedSet = [] current = 0 features = vector.features(selectLayer) featureCount = len(features) total = 100.0 / float(len(features)) for current,f in enumerate(features): geom = QgsGeometry(f.geometry()) intersects = index.intersects(geom.boundingBox()) for i in intersects: request = QgsFeatureRequest().setFilterFid(i) feat = layer.getFeatures(request).next() tmpGeom = QgsGeometry(feat.geometry()) if geom.intersects(tmpGeom): selectedSet.append(feat.id()) progress.setPercentage(int(current * total)) for i, f in enumerate(vector.features(layer)): if f.id() in selectedSet: writer.addFeature(f) progress.setPercentage(100 * i / float(featureCount)) del writer
Om det inte står som ovan, så kan du helt enkelt redigera filen så att det gör det (ta en kopia på filen först). Spara och starta om QGIS. Nu skall det fungera att använda verktyget.
Buggen ovan hittade jag på QGIS sida för problemrapportering vilket är en bra källa att vända sig till om man stöter på problem som man tror är buggar.