Tag Archive | GPX

Garmin Träningsklocka och GIS

Garmin stödjer inte Linux! Men det struntar jag i. Jag kan ansluta min träningsklocka till datorn och överföra träningsdata i alla fall, och behöver inte fräcka webbgränssnitt som ändå inte gör det möjligt att analysera i ett GIS.

Häng med så tittar vi på hur det går till. Läs mer…

Bearbeta många filer med skript

Det här är del 3 av mina inlägg om skript i Linux för att göra om gpxfiler till shape. Har du inte läst de två tidigare så bör du börja med dessa.

Då har vi tittat på hur man gör om gpxfiler till shape och hur man får skriptet att upprepa sig tills man säger ifrån. Nu skall vi titta på hur man gör om man har en mängd filer som man vill bearbeta på en gång, och inte en i taget. Rent tekniskt så kommer filerna att bearbetas en åt gången, men för användaren så begränsas handhavandet till att peka ut en katalog där filerna finns.

Principen är den samma som tidigare och utgångspunkten är skriptet från i måndags.

Till att börja med så modifieras texten som användaren möter till att ge instruktioner att ange en katalog och inte en fil.

echo -n ”Skriv in sökväg till (eller dra-och-släpp) katalog med gpx-filer >”

Eftersom variabeln ”Filnamn” nu är en katalog så måste ett ”wildcard” läggas till för att passa alla gpxfiler. Därför modifieras den efterföljande raden.

Filnamn=${Filnamn//\’/}”/*.gpx”

Före if-satsen som kontrollerar om loggfilarna redan finns så läggs en loop till som i variabeln ”Fil” listar alla gpxfiler på den angivna sökvägen. Man kan även lägga till en rad för att skriva ut vilken fil skriptet för tillfället kör.

for Fil in $Filnamn;
do
echo ”Bearbetar: $Fil”
if [ -f $Testa ]

Variabeln ”Filnamn” kan tyckas missvisande, men då det är ett arv från det tidigare skriptet så låter jag det vara så länge. Du kan ändra namnet till något som är mer passande om du vill, bara du tänker på att ändra på alla platser.

Eftersom namnet på gpxfilen nu lagras i variabeln ”Fil” och inte ”Filnamn” så måste detta ändras i de båda ”ogr2ogr” kommandona.

ogr2ogr -update -append $Target $Filnamn ”tracks” ”waypoints” $DatumFix $Prj

ogr2ogr $Target $Filnamn ”tracks” ”waypoints” $DatumFix $Prj

För att avsluta skriptet så stängs loopen genom att ersätta ”clear” med ”done” och ”echo” kommandot ändras så att det blir mer passande.

echo ”Filerna ovan har lagrats på sökvägen $Target”

Jag väljer att radera ”clear” ovan för att jag inte vill rensa listan med gpxfiler direkt utan vänta de angivna sekunderna så att användaren har en chans att se resultatet. Om du tycker att listan visas för kort tid kan du ersätta ”sleep” kommandot med ”read s” som väntar på att du skall mata in något i den godtyckliga variabeln ”s” innan det avslutas.

Såja, då var det klart. När du nu kör skriptet och ”drar-och-släpper” en katalog, eller skriver in sökvägen till en katalog så kommer alla gpxfiler att bearbetas och sparas i loggfilerna på den i skriptet angivna sökvägen. Det är bara gpxfiler som behandlas, alla andra filer och kataloger hoppar skriptet över (med hjälp av angivet ”wildcard” i början). Vill du även söka i underkataloger så måste skriptet modifieras ytterligare.

Det var allt om skript för den här gången.

Bearbet flera filer med skriptet

I förra inlägget visade jag hur du kan skriva ett skript i Linux för att göra om gpxfiler och samla dessa i två loggfiler, en för waypoints och en för spår.

Tänk om du har flera gpxfiler samtidigt och inte vill behöva köra skriptet varje gång, utan på något sätt lägga till en fil i taget genom att ”dra-och-släppa” dessa i terminalfönstret?

För detta så krävs det bara tre extra rader kod…

Efter det inledande #!/bin/bash så läggs följande till:

Filnamn=”inte exit”
while [ $Filnamn != ”exit” ]; do

Detta startar en loop som håller på tills du matar in texten ”exit” i stället för ett filnamn. Sist i skriptet så läggs ett kommando som avslutar loopen till:

done

Skall vi vara noggranna så körs loopen en sista gång med filnamnet ”exit” men det gör inget, fast det kan se lite konstigt ut att skriptet säger att ”Filen exit lagrades på sökvägen …” så ett sätt att undvika detta och snabba upp processen är att ta bort raderna med echo ”Filen $Filnamn lagrades på sökvägen $Target” och sleep 5.

Det var allt. Nu går det att dra och släppa gpxfiler i terminalfönstret när skriptet körs, och efter varje tryck på returtangenten så återställs skriptet, tills man matar in texten exit.

Förenkla med skript

Många arbetsuppgifter görs flera gånger och inte nödvändigtvis så ofta att man alltid kommer ihåg hur man gjorde. Då kan det vara läge att fundera över att skapa ett skript som löser uppgiften åt dig.

Jag använder ibland GPS när jag är ute och gör något, och det är då smidigt att ha ett skript som automatiskt tankar av och tömmer mottagaren till datorn, samt gör om data till ESRI shape. Jag har visat detta tidigare i bloggen, men jag tänkte vara lite mera generell denna gången.

Har du ett ofta återkommande behov av att flytta, spara, konvertera eller bearbeta geografiska data så är detta inlägget för dig.

Jag kommer att bygga mitt exempel på terminalen i Linux och ett verktyg i biblioteket GDAL, som även finns för Mac och Windows.

Vad är det som är så bra med terminalen? Jo alla kommandon som går att skriva i terminalen kan enkelt skriptas på ett enkelt och interaktivt sätt utan att man behöver avancerad programmering eller ens tillverka ett grafiskt användargränssnitt, vilket inte alltid är så enkelt. Du kan exempelvis enkelt skapa ett skript som söker efter och kopierar alla QGIS projektfiler till en gemensam katalog eller skapar en zip-fil med alla Jpg-bilder på en bestämd sökväg.

För att hantera geografiska data i olika format så använder jag verktyget ogr2ogr som installeras med GDAL via kommandot:

sudo apt-get install gdal-bin

Vill du se vad kommandot kan utföra så skriv ogr2ogr –help och vill du se alla format som verktyget kan hantera så skriv ogr2ogr –formats.

”ESRI Shapefile” (read/write)
”MapInfo File” (read/write)
”UK .NTF” (readonly)
”SDTS” (readonly)
”TIGER” (read/write)
”S57” (read/write)
”DGN” (read/write)
”VRT” (readonly)
”REC” (readonly)
”Memory” (read/write)
”BNA” (read/write)
”CSV” (read/write)
”GML” (read/write)
”GPX” (read/write)
”KML” (read/write)
”GeoJSON” (read/write)
”Interlis 1” (read/write)
”Interlis 2” (read/write)
”GMT” (read/write)
”SQLite” (read/write)
”DODS” (readonly)
”ODBC” (read/write)
”PGeo” (readonly)
”OGDI” (readonly)
”PostgreSQL” (read/write)
”MySQL” (read/write)
”PCIDSK” (readonly)
”XPlane” (readonly)
”AVCBin” (readonly)
”AVCE00” (readonly)
”DXF” (read/write)
”Geoconcept” (read/write)
”GeoRSS” (read/write)
”GPSTrackMaker” (read/write)
”VFK” (readonly)

Jag tänker göra ett skript som tar gpxfiler och adderar dessa data till två shapefiler. En för spårloggar och en för waypoints. Det skulle lika gärna kunnat vara en PostGIS databas eller en GeoJSON fil.

Att bara göra om filer, i det här fallet från gpx till shp, är inte alls svårt. Använd bara kommandot ogr2ogr -f ”ESRI Shapefile” målfil.shp källfil.gpx ”lager”. I praktiken så blir det dock lite mera, inte minst då jag vill skriva till samma fil varje gång.

Nåja låt oss sätta igång. Börja med att skapa en textfil och döp den till ”gps2shp.sh” eller valfritt filnamn med filändelsen *.sh. Först i filen skriver man #!/bin/bash för att tala om att det är ett skript som använder ”bash”.

Sedan vill jag att användaren skall mata in eller dra-och-släppa gpxfilen, så då skriver man följande för att hantera detta:

echo -n ”Skriv in sökväg till (eller dra-och-släpp) gpx-fil >”
read Filnamn
Filnamn=${Filnamn//\’/}

Efter en bekräftelse med retur så finns nu filens sökväg lagrad i variabeln ”Filnamn”. Den sista raden tar bort extratecken som skapas vid ”dra-och-släpp”, annars fungerar det inte.

Man bör även sätta projektionen på shapefilen så detta kan man skapa en variabel för och använda senare:

Prj=”-a_srs EPSG:4326”

Konverteringen från gpx till shape får även datum och tid att krångla så ett kommando för att konvertera datum till text kan också sparas i en variabel:

DatumFix=”-fieldTypeToString DateTime”

För att hålla isär saker och ting så kan man även skapa en variabel för sökvägen till målfilerna:

Target=”gps-loggar”

I och med att det blir olika kommandon om loggen skall skapas eller om den redan finns så måste man använda ett villkor i skriptet. Villkoret testar om det finns en känd målfil på angiven sökväg.

Testa=$Target”/waypoints.shp”
if [ -f $Testa ]
then
#Kod att köra om filen finns
else
#Kod att köra om filen inte finns
fi

Jag återkommer till den utelämnade koden längre ner. Kommandot -f $Testa undersöker om filen i variabeln ”Testa” existerar, och om den gör det är villkoret sant. Om filen inte finns är villkoret falskt.

Det kommando som skall köras om filen finns ryms på en enda rad:

ogr2ogr -update -append $Target $Filnamn ”tracks” ”waypoints” $DatumFix $Prj

Koden som behöver köras om filen inte finns är snarlik, men föregås av att sökvägen till loggen skapas:

mkdir $Target
ogr2ogr $Target $Filnamn ”tracks” ”waypoints” $DatumFix $Prj

i Båda kommandona ovan så väljs endast lagerna tracks (linjer) och waypoints (punkter) ut. Vill du se vilka fler lager som finns i en fil skriver du in kommandot ogrinfo filnamn.

1: waypoints (Point)
2: routes (Line String)
3: tracks (Multi Line String)
4: route_points (Point)
5: track_points (Point)

Det var det hela. Man kan ju förstås lägga till en rad för att tala om att allt skriptet är klart.

clear
echo ”Filen $Filnamn lagrades på sökvägen $Target”
sleep 5

För att kunna köra skriptet när man dubbelklickar på filen så kryssar man i ”Tillåt körning av filen som ett program” på fliken ”Rättigheter” under filegenskaperna (högerklicka på filen).

Skärmbild från 2013-08-24 19:38:57

Nu är det bara att köra skriptet när man behöver lägga till gpx filer till en loggfil, och kom ihåg att principen är den samma oavsett vilka format du vill konvertera emellan så länge de stöds av kommandot. Loggfilerna skapas där skriptet är sparat som skriptet är skrivet nu, men det går att ange en annan sökväg enkelt genom att redigera skriptet. Kanske även lägga till en ”dra-och-släpp” funktion för att ange sökvägen till var loggarna skall sparas?

Du kan även hämta hela skriptet på sökvägen http://geosupport.kvarnarp.eksjo.com/files/gpx2shp.sh.

QGIS, GPS och visualisering av spår

Jag hade tänkt att visa hur man gör för att visualisera sina GPS loggar på en karta på ett mer flexibelt sätt än i de program som brukar följa med GPS mottagare.

Jag använder som vanligt senaste versionen av QGIS, och mina GPS loggar kommer från min GPS-logger (se tidigare inlägg) men du kan använda vilken GPS som helst, så länge du kan få ut filer i GPX format till datorn på något sätt. Jag använder Linux men du kan använda vilket operativsystem du vill och är bekväm med.

Först så vill jag ha lite bakgrundskartor så jag lägger till Bing Maps flygbilder (lägga till Open Layers plug-in).

Sedan är det bara att lägga till ett vektorlager genom att klicka på ”plus-knappen” med en grön-blå bakgrund ( ), leta reda på GPX filen och öppna den.

När man klickat på ”öppna” så får man upp en ny fråga rörande vilka data man vill öppna och vilken typ av geometri man vill ha.

Vilka lager som fungerar beror på vad som finns lagrat i filen. Om du vare sig har rutter eller waypoints så kan du hoppa över dessa. Jag vill öppna mina ”spår” (tracks) som punkter, så jag får med GPS data för varje punkt, men jag lägger även till ”MultiLineString” så kan ni se denna linje i de kommande bilderna även om jag bara kommer att beröra punkterna.

På den första bilden nedan så ser du mitt spår på flygfotot. Det enda detta säger är att det finns en spårpunkt sparad längs vägarna i bilden.

Resten av det jag skall visa är lite beroende av vilka data som GPS mottagaren sparar, så du kan få göra lite anpassningar till din egen data.

Jag börjar med att öppna attributtabellen och titta lite på vilka data jag har. Detta gör jag genom att högerklicka på lagret till vänster och välja ”Open Attribute Table”. Nu kan man bestämma sig för var man skall börja.

Jag öppnar ”properties” för lagret och väljer fliken ”Stil”. Här tänker jag utnyttja attributen till max.

Jag väljer ”Graduated” symbol med ”Speed” som variabel indelat i fem klasser med en färgramp från blått till rött (ju rödare desto fortare går det).

Symbolen ändrar jag från ”Simple Marker” till ”Font Marker” och letar reda på något jag kan använda som färdriktning, i mitt fall en pil. Jag bygger pilen i två lager där det undre lagret är lite större med vit färg. Detta ger en tunn ram runt min färgade pil som gör den lättare att se. Jag ”låser” även pilen i bakgrunden så att den inte påverkas av färgändringarna. Jag passar även på att lägga till en liten transparens, runt 15-20 % vilket får symbolen att smälta in bättre i kartan. Det är viktigt att välja en pil som pekar uppåt annars kommer nästa steg inte att fungera.

På stilfliken så finns det en knapp döpt till ”Advanced”. Under denna väljer jag ”Rotation Field” till ”Heading” och ”Size Scale Field” till ”PDOP”. Detta kommer dels att rotera min pil i färdriktningen (kräver att det finns riktningsdata i GPX filen) och ändra storleken på pilen beroende på om det är bra eller dålig GPS täcknig (små pilar är bättre än stora).

Avslutningsvis så lägger jag till en text vid varje pil som skriver ut hur många satelliter som använts för beräkningen av varje punkt.

Nu tror jag att du fått tillräckligt med exempel för att själv jobba vidare med dina egna GPX filer och experimentera lite i QGIS.

Just det, om du vill göra om dina GPX filer till ett annat format (Shape, KML, etc) så är det bara att högerklicka på lagret och välja ”Spara som…”.

Lycka till!

Skapa Shapefiler från GPS logger

Har du en QSTARZ GPS logg (MTK II chipset) och använder Linux? Då är detta inlägg för dig.

Min GPS logger är en mycket användbar liten burk. En av och på knapp och en ”fånga waypoint” knapp, och inget mera. Den är superkänslig och jag kan ha den i fickan på jackan när jag är ute och behöver inte bry mig så mycket mer om den. Batteriet varar gott och väl en hel dag och om man inte loggar allt som går att logga så är det ingen risk att man fyller minnet heller.

Vill du läsa vidare så klicka… Läs mer…