Tag Archive | Skript

GPS med Windows

Detta är egentligen samma inlägg som i går, men för Windows. Det är nämligen inte riktigt lika enkelt att installera gpsbabel och ogr2ogr på Windows eller OS X som på Linux, och man får göra saker lite annorlunda. Därmed inte sagt att det är särskilt svårt…

Först så skall gpsbabel installeras. Hämta installationsfilerna från http://www.gpsbabel.org/download.html.

Med installationen får man även ett grafiskt gränssnitt som kan vara användbart i många situationer, men jag lämnar det där hän just nu.

För att kunna köra gpsbabel från kommandoprompten så måste man lägga till sökvägen till programmet i systemet. Det går att göra i miljövariablerna, men eftersom detta handlar om terminalfönster och enkla skript så kommer här kommandot för att åstadkomma samma sak, ändra sökvägen till din egen.

path c:\programets sökväg\gpsbabel;%PATH%

”Path” är en variabel med alla sökvägar som används för att bland annat leta efter körbara filer och man ställer in denna med kommandot ovan. För att inte skriva över alla tidigare variabler är det viktigt att ha med ”;%PATH%” på slutet. Vill du vara säker på att inget försvinner så kan du börja med att ge kommandot path utan tillägg, då listas nämligen alla sökvägar. Detta kan användas för att återskapa dessa om olyckan är framme.

För att testa så kan man ansluta en Garmin GPS via USB och skriva kommandot nedan:

gpsbabel -i garmin -f usb:

Du behöver Garmins USB-drivrutiner installerade för att detta skall fungera, och om du använder en annan mottagare så behöver du drivrutiner för den. Samma kommandon som redovisades i gårdagens inlägg fungerar även nu. För att ladda hem alla waypoint och spårloggar så används kommandot:

gpsbabel -w -t -i garmin -f usb: -o gpx -F gpsdata.gpx

Vid nedladdning av spårdata från Garmin så fick jag ett felmeddelande:

[ERROR] A301_Get: Non-Pid_Trk_Data

Lösningen var att välja en annan installationskälla (se längre ner). Då fungerar det utmärkt.

Konvertera till SHP

Även ogr2ogr finns för Windows (och OS X) och kan hämtas och installeras från http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries.

Ett sätt att installera såväl gdal som gpsbabel på Windows är att använda OSGeo4W och det avancerade installationsalternativet.

Screenshot 2014-01-18 12.27.43

Då kan man bland annat välja att installera gdal och gpsbabel, men även exempelvis senaste utvecklingsversionen av QGIS…

Som standard så installeras binärfilerna på sökvägen c:\osgeo4w\bin med installationsalternativet ovan. Man lägger till sökvägen hit på samma sätt som tidigare med path. Om du nu läst hela artikeln innan du testat själv, så kan du installera gpsbabel och ogr2ogr samtidigt och lägga till deras sökvägar med ett och samma kommando, och dessutom slippa det krångel som jag hade med felmeddelanden tidigare.

path c:\osgeo4w\bin;%PATH%

För att sedan göra om gpx-filerna så används nästan samma kommando som i går.

ogr2ogr -f "ESRI Shapefile" målkatalog källfilen.gpx -fieldTypeToString DateTime

Mer information om syntaxen får man om man skriver enbart ogr2ogr.

Nu kan man antingen använda sina kommandon i andra program för att utföra saker och ting, eller skapa ett skript som går att köra som ett vanligt program. Nedan är ett exempel som hämtar spårpunkter och waypoints från en ansluten Garmin GPS (USB) och lägger till dessa spår i en shapefil i katalogen ”loggar”.

gpsbabel -t -w -i garmin -f usb: -o gpx -F tracks.gpx
ogr2ogr -append -f "ESRI Shapefile" loggar tracks.gpx "track_points" -fieldTypeToString DateTime

Mer än så behövs inte… Spara skriptet i en textfil med filändelsen cmd och sedan är det bara att dubbelklicka för att köra.

Annonser

Geosupport på GitHub

Som trogna läsare kanske noterat så finns numera geosupportsystem även på GitHub.

https://github.com/klakar/geosupportsystem

Det var när jag fick problem med min Internetleverantörs FTP-tjänst som jag undersökte alternativ och då blev GitHub ett naturligt val.

Eftersom det i huvudsak är skript som jag vill göra tillgängliga för er läsare, så fungerar detta utmärkt. Det går dessutom enkelt att redigera skripten online om man vill eller behöver göra en förändring.

Vi får se hur jag kommer att använda GitHub framöver, men håll ögonen öppna så får vi se.

Egen server för geodatatjänster – Del 10

I detta inlägg så kommer jag inte att ta upp så mycket nytt utan här handlar det uteslutande om att automatisera alla manuella handgrepp som gicks igenom i de inledande delarna för att installera alla servertjänster.

Du kommer fortfarande att få göra en del säkerhetsinställningar och annat, men i princip så ger instruktionen här dig en komplett geoserver genom att bara köra ett ”litet” skript.

Skriptet installerar även lite ytterligare ”bra att ha” funktioner, som en ssh-server för att sköta administration via nätverket.

Struntar du i vad som står på raderna i skriptet och bara vill komma igång så loggar du in på din nyinstallerade och uppdaterade Linux Ubuntu 12.04 Server och skriver in följande:

sudo su
wget https://github.com/klakar/geosupportsystem/raw/master/geoserver.sh
sh geoserver.sh

Vill du skapa skriptet lokalt så kopierar du texten nedan och klistrar in den i ett textdokument som du sparar under namnet geoserver.sh, eller ett annat valfritt namn. Placera skriptet så att det går att komma åt från servern via exempelvis ett http, eller ftp-kommando:

wget http://192.168.0.1/geoserver.sh

Kör sedan skriptet som root:

sudo su
sh geoserver.sh

Skriptet kommer du åt genom att klicka på länken här: 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.

WordPress till installationsskriptet

Såja, nu är installationsskriptet uppdaterat så man kan välja mellan Drupal och WordPress som CMS system.

Om man väljer WordPress så installeras även några plugin som ger möjlighet att aktivera exempelvis OpenStreetMap eller Google-kartor på sidorna.