Tag Archive | analys

GIS – Överlagring och Kombinationer

Om det kan bli krångligt att skapa avancerade rumsliga analyser, så blir det inte lättare nu. Då gäller det att man har god koll på processen i förväg och en tydlig bild av vad man vill göra, innan man gör det.

Det som menas med rubriken är dels att slå samman attributtabeller och dels att ”plocka” värden från andra lager baserat på geografiskt läge.

Läs mer…

Annonser

GIS – Rumslig Analys

Denna vecka fortsätter vi serien om vanliga uppgifter med ett GIS. Som tidigare exemplifierar jag med QGIS, men generellt så spelar det ingen roll vilket verktyg du använder. Om du vill hänga med från början så får du hoppa tillbaka en vecka bland inläggen där allt drar igång.

Rumslig analys handlar framför allt om ”var?”. Del i detta var den enkla frågan från förra inlägget där man använder attribut för att söka efter objekt med specifika egenskaper. Här bygger vi på detta med utsökningar i ett geografiskt sammanhang.

Läs mer…

Ruttplanering i QGIS

Jag tänkte ta mig till Gränna, men vet inte vilken väg jag skall välja.

Vilken tur att jag har hämtat hem Open Street Map data över Sverige och har QGIS installerat.

Ruttplanering görs via ett insticksprogram som aktiveras under ”Hantera och installera insticksprogram”.

Screenshot from 2014-10-26 17:00:20Insticksprogrammet heter Road graph och på svenska ”Väggraf”. När det är aktiverat så får man ett nytt menyalternativ för inställningar under menyn Vektor och ett nytt eventuellt dockat dialogfönster.

Screenshot from 2014-10-26 17:09:25I dialogfönstret kan man använda knappar för att klicka ut start och slutpunkter, sedan är det bara att köra ”Beräkna”.

Som standard så räknas kortaste vägen fram, men med rätt inställningar så kan man även få fram snabbaste vägen, men detta förutsätter information om hastighet för vägsegmenten.

För helt korrekt rutt så måste man även ha information om enkelriktning och om någon del är begränsad med hänsyn till fordonstyp (lastbil på cykelbana). Vill man spara rutten så klickar man på ”Exportera”, vilket gör det möjligt att spara rutten som vanligt lager.

I menyn Vektor så döljer sig inställningarna för verktyget.

Screenshot from 2014-10-26 17:31:44Här går det att välja fält och värde för exempelvis enkelriktat, om man har denna information (saknas delvis i mina OSM-data). Det går heller inte att ange vilken typ av väg som skall användas, så man får nog göra ett urval av vägar först för att ta bort olämpliga vägar.

Min rutt mot Gränna tog exempelvis sin början längs cykelvägen mot staden, genom en gång- cykeltunnel, mot enkelriktat och sedan längs stora och små vägar blandat (säkert den absolut kortaste vägen) till det utpekade målet. Verktyget fungerar, men det är inte jättesmart och tar ganska lång tid på sig att räkna fram rutterna, så jag tror att det jämför ganska många möjliga alternativ innan ett resultat levereras. Detta borde gå att göra smartare, eller.

Lite intressant är fältet för topologisk tolerans, något som inte finns när jag skall beräkna rutter i min version av ArcMap på jobbet. Där får man snällt se till att hela vägnätet hänger ihop med korrekta topologier. Exakt vad som händer när man ändrar denna parameter vet jag inte och det tar emot att prova då varje liten beräkning tar flera minuter på det data jag använder (alla vägar i Sverige).

Egna modeller – i QGIS

[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”.

Screenshot from 2014-08-01 09:50:34

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?”.

Screenshot from 2014-08-01 10:04:14

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.

Screenshot from 2014-08-01 10:08:49

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.

Screenshot from 2014-08-01 12:04:55

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.

Screenshot from 2014-08-01 12:07:22

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:

Screenshot from 2014-08-01 12:10:22

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.

Enkla linjer…

När jag satt med kartorna över Ukraina tidigare i veckan så slog det mig att jag skulle vilja lägga in UTM gränserna som linjer på min projicerade karta och se hur det ser ut.

Det finns säkert många bättre sätt att göra detta på men metoden är det som framför allt intresserar mig nu. I detta inlägg tittar vi på ”snapping” eller fästning som det heter i QGIS och diverse analysverktyg för att skapa linjer och ytor automatiskt. Samtidigt försöker jag belysa fler problem med projicerade kartor och oprojicerade data.

Tanken från början var att skapa ett linjelager och genom att ange koordinater manuellt skapa brytpunkter vid rätt punkter. Då uppstod problem nummer ett, hur anger man brytpunkter för vektorobjekt manuellt?

Efter att letat men inte hittat något så sätter jag upp det på ”att göra” listan och provar en annan modell. Jag anger helt enkelt koordinaterna i en textfil och öppnar den som tabell i QGIS.

longitude,latitude,etikett
0,0,"30/31"
0,85,"30/31"
6,0,"31/32"
6,85,"31/32"
12,0,"32/33"
12,85,"32/33"
18,0,"33/34"
18,85,"33/34"
24,0,"34/35"
24,85,"34/35"
30,0,"35/36"
30,85,"35/36"
36,0,"36/37"
36,85,"36/37"

Textfilen öppnas med verktyget för att lägga till separerade textfiler (näst längs ner till vänster i bilden nedan):

Skärmbild från 2014-03-02 17:06:51

I dialogrutan så hittas automatiskt rubrikerna longitude och latitude så det skall inte behöva göras några justeringar, men en liten kontroll skadar inte.

Nu har punkterne lästs in, men jag vill ju ha linjer. Det går dock att skapa ett nytt linjelager och använda ”Val för fästning…” under menyn ”Inställningar” och se till att det finns ett värde i rutorna för de lager man vill kunna fästa emot. Jag väljer 5 pixlar som tolerans och börjar redigera mitt linjelager. Det är inte alltid det låser mot punkterna, men om man zoomar lite in och ut så brukar det dyka upp en extra markering som antyder att fästningen fungerat.

Linjerna fungerar bra, men bara om projektet är oprojicerat. Om man som jag projicerat i en UTM zon så blir det lite knas i kanterna.

Skärmbild från 2014-03-02 17:37:15

I bilden ovan så är kartan projicerad i zon 36 och linjerna går mellan punkter på ekvatorn och 85 grader norr. Punkterna ligger på rätt ställe, men linjerna följer inte gradlinjerna utan dras kortaste vägen, vilket blir tydligt när man jämför linjen med punkten i England där den borde passerat igenom.

Det går att generera linjerna automatiskt med ett analysverktyg (bilden nedan) men dessa linjer skapas på samma sätt, och det blir än tydligare när jag även skapar latitudlinjer vid var åttonde latitud. Dessa skall ju också vara böjda.

Skärmbild från 2014-03-02 17:50:09

Ett alternativ är att generera polygoner med samma intervall och därmed komma lite närmare sanningen, men det blir inte riktigt bra ändå.

Skärmbild från 2014-03-02 17:57:20

Vill man ytterligare förbättra upplösningen så blir det till att lägga till flera brytpunkter. I bilden ovan så finns ca 10 brytpunkter längs med linjerna, men det går ganska smidigt att ”förtäta” dessa ytterligare med ett nytt analysverktyg.

Skärmbild från 2014-03-02 18:07:09

”Förtäta geometrier” hittar man under menyn ”Vektor – Geometriverktyg”. Här har jag valt att lägga till 50 noder, vilket skapar 50 extra punkter mellan ändpunkterna i varje linje i originalfilen.

Avslutningsvis kommer här en bild som jämför de första linjerna med dessa förtätade.

Skärmbild från 2014-03-02 18:08:40

Har du förresten märkt att jag använd gradientfyllning i polygonerna i bilderna ovan? Det blev faktiskt inte alls så dumt.

För få brandstationer?

I lokalmedia såg jag för ett tag sedan en rubrik om att de östra delarna av regionen riskerade att bli utan brandsläckningsresurser.

Jag läste inte närmare vad det handlade om, utan gick direkt till http://geodata.se och hämtade data om brandstationer från MSB.

Lite snärtigt gjorde jag en täckningskarta baserad på personal i beredskap på varje station och satte inflytelserna till 50 km.

Skärmbild från 2013-10-26 18:43:22

Av detta kan man utläsa var det är ”bättre” eller ”sämre” täckning för brandberedskapen.

Nu tar detta inte hänsyn till folkmängd, vilket vore intressant för att se om det är omotiverat dåligt eller bra på olika platser.

Det var precis lika lätt att skapa en karta över befolkningstäthet…

Skärmbild från 2013-10-26 18:47:50

Sedan blev det värre.

Jag försökte använda rasterkalkylatorn för att dela brandberedskapen med befolkningstätheten för att få en resulterande kvot, men det gick inget vidare. Det visade sig dock att det inte gick att beräkna raster med olika referenssystem, så efter en konvertering så var båda lagren lika och beräkningen fungerade bra.

Skärmbild från 2013-10-26 19:40:34

Direkt när beräkningen var klar så syntes inte mycket i resultatväg, men det berodde på några extremvärden som fick skalan att balla ur. Genom att sätta gränserna så att de 10 högsta respektive lägsta procenten av värden ignorerades så kom bilden ovan fram.

Ingen direkt vetenskaplighet bakom, mer än att där det är grönt är det bättre än där det är rött. I några fall kan det bero på ”no-data” i källdata, men i stort så ser det ganska bra ut. Det är i huvudsak en jämn täckning på brandberedskapen, men detta beror inte så mycket på att det är gott om brandstationer som att jag gav alla brandstationer ett högt inflytelsevärde över ett stort område. Det som blir intressant är de områden som avviker och där ställa sig frågan varför? Är de helt obefolkade områden utan riksintressen som behöver brandskydd?

Här hade jag då tänkt påstå att de som bodde i ett någorlunda känt samhälle i ett av de röda områdena inte skulle hålla med, men jag hittade faktiskt inte någon solklar kandidat. Det närmsta jag kom var Häradsbäck öster om Älmhult (ca 180 invånare).

”Heat Map”

En vanlig typ av analys är att skapa heat-maps, eller lager som representerar intensiteten av något. I detta inlägg tänkte jag visa hur det går till i QGIS.

Det är otroligt lätt, när man väl insett att det finns några små begränsningar.

För det första så kan jag inte få det verktyg jag använder att fungera på data från PostGis… Det fungerar bara med shape.

För att ha något att laborera med så tar jag Sveriges kyrkor, som jag även använde här om dagen. Kanske kan bekräfta att Höglandet är Sveriges ”bibelbälte”?

Först så behövs ett insticksprogram, som sannolikt redan är installerat men behöver aktiveras, vid namn Heatmap.

Skärmbild från 2013-10-13 14:50:45

Sedan är det bara att köra verktyget, peka ut källdata och ställa in önskade parametrar. Man startar verktyget i menyn ”Raster”.

Skärmbild från 2013-10-13 14:52:14

Det är som sagt i indata som jag inte fått det att fungera med data från PostGis, medan shape går hur bra som helst. När det gäller kyrkodata så har jag även raderat de kyrkor som har helt galna positioner då dessa annars hade ställt till det lite. Om kyrkan låg mer än 100 km från Sveriges gräns, så rök den!

Som utdata så skapar man en rasterfil. Den kan vara av en mängd olika format, men GeoTiff är ett säkert val och vissa format kan i vissa situationer krascha QGIS.

Radie är det avstånd från varje objekt som man skall tillåta influenser. Större värde tar influenser från ett större område och ger även ett lite grövre resultat, medan små avstånd kan ge ett ”mjukare” och mer detaljerat resultat med risken att det blir så litet att det inte finns några objekt i närheten som kan ge influenser. För kyrkor så provar jag med 10 km.

I de avancerade inställningarna så kan man ändra rader/kolumner eller cellstorlek, vilket bestämmer pixelstorleken på det genererade rasterlagret. Många rader och kolumner eller liten cellstorlek ger hög upplösning på resultatet. I mitt fall så tror jag att pixlar runt 1000 meter räcker gott. Verktyget rättar till inmatade värden beroende på vilken utsträckning indata har.

”Kernel shape” används för att ange hur influenserna avtar med avståndet från varje objekt. Olika kurvor ger olika resultat, så här får man prova lite för att hitta något som passar.

Vill man skräddarsy ännu mer så kan man skapa attribut som styr den radie som skall påverka och om objekten skall ha olika betydelse för analysen. Kyrkor i glesbygd kanske skulle ha en större radie, medan stora kyrkor med stora församlingar skulle ha en större vikt. Men här struntar jag i det utan kör med positionen som enda ingångsvärde. Decay Ratio kan anges för vissa av Kernelalternativen.

Skärmbild från 2013-10-13 14:45:12

När man har fått fram sitt lager så kan man leka lite med stil och transparens tills man är nöjd, sedan är det bara att dra slutsatser.

Har man sett! Västergötland är oväntat kyrkotätt, är det det här som är det sanna bibelbältet?