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).
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.