Etikettarkiv | Python

GPS och Raspberry Pi (del 3)

Detta är som sagt den tredje delen i serien med Raspberry Pi (RPi) och GPS. I fösta delen kopplades GPS-modulen ihop med RPi:n via den inbyggda UART:en, och i andra delen användes en daemon för att läsa och koppla positionsinformation till Pythonkoden. I slutet av del två så hade jag en skräddarsydd GPS-logg som skrev data till en fil.

Jag har nu förfinat koden lite så att loggen döps automatiskt och skrivs till ett kopplat USB-minne i stället, vilket blir mer praktiskt än att behöva ta ur det lilla SD-kortet eller koppla upp nätverk och SSH hela tiden. Mitt python skript körs även automatiskt när RPi:n bootar. Allt detta är finesser som egentligen inte behövs för att lära sig något, men om det är många som vill ha en mer detaljerad redogörelse för hur detta gjordes så säg till så kanske det blir ett inlägg om detta specifikt.

I det här inlägget så kommer det dock att bli GPIO och lysdioder och knappar. Jag släpper GPS lite så att är du bara intresserad av GPIO funktionalitet med RPi, så behöver du inte stressläsa de tidigare två delarna.

Läs mer…

GPS och Raspberry Pi (del 2)

Har du inte läst gårdagens inlägg, så gör det inte så mycket. Där beskriver jag hur jag kopplar samman en GPS med en Raspberry Pi (RPi) till en seriell port via de inbyggda UART kretsarna.

Vill du göra motsvarande eller läsa om hur det gick till så skall du börja med det inlägget, men vill du bara veta hur du får in seriell GPS i Python (linux), då räcker det att hänga med här.

Läs mer…

Python skript i ArcMap

Jag har slitit ett tag med Python för ArcMap 10. Det är ju nämligen så att stödet för VB, som jag använt tidigare, snart bara är ett minne blott i ESRI’s programvara. Därför så gäller det att börja fundera på vilka gamla skript som fortfarande skall användas när bytet till 10 sker.

Man måste även veta om man byter till 10.0 eller 10.1, eftersom det är ganska stor skillnad mellan dessa versioner till fördel för 10.1.

Skripten är vanliga textfiler med filändelsen *.py och går att skriva i vilken textredigerare som helst, men jag föredrar någon form av IDE (utvecklingsprogram) så att man får lite hjälp med syntaxen med mera.

Jag har använt flera olika IDE, men senaste tiden har jag använt Eclipse med PyDev för att skriva Python skript. Det går dock att testa mycket av Pythonskripten direkt i Python konsolen i ArcMap, om man inte vill eller kan använda en IDE.

För att använda ArcGis funktionalitet i sina skript så måste man importera ArcGis Python bibliotek vid namn arcpy.

import arcpy

Sedan går det att göra i stort sett allt som går att göra i ArcMap direkt via skript. Man behöver inte ens ha ArcMap öppet för många uppgifter.

Jag har mest intresserat mig för layoutläget och kör därför skripten via toolboxen inne i ArcMap.

Skapa klasser för dokumentet:

mxd = arcpy.mapping.MapDocument(”Current”) # Skapa klass för det öppna dokumentet
df = arcpy.mapping.ListDataFrames(mxd)[0] # Skapa klass för första dataramen

För att skicka värden till skriptet så används sys biblioteket, så detta måste också importeras:

import sys

Variabler hämtas med kommandot sys.argv[0] där nollan representerar det första argumentet, men det går att ha hur många argument som helst, genom att stega upp siffran.

skala = sys.argv[1] # Hämta första argumentet och spara i variabeln ”skala”

Argumenten skapas i ArcMap genom att man i ArcToolBox importerar skiptet och sätter de ”parametrar” som man vill kunna skicka till skriptet. I mitt fall så skapar jag en parameter kallad ”Skala” som är av typen Double, samt en parameter ”Rubrik” (String) som används senare.

För att sätta den angivna skalan i dataramen så skriver man följande.

df.scale = skala

Jag vill även ändra en rubriktext i layouten. Därför så sätter jag ”Element Name” till tRubrik under textens egenskaper.

Detta namn använder jag sedan för att hitta rätt textelement och ändra texten till värdet i det andra argumentet.

rubrik = sys.argv[2]
elements = arcpy.mapping.ListLayoutElements(mxd, ”TEXT_ELEMENT”) # Skapa lista med alla textelement

for element in elements: # Loopa igenom alla textelement
      if element.name == ”tRubrik”: # Om Element Name är ”tRubrik” så…
            element.text = rubrik # Byt ut texten till den inmatade.

Sådär. Då har jag ändrat skalan och rubriken till värden som jag matat in i ett formulär när jag kör skriptet i toolboxen. Det sista att tänka på i skriptet är att uppdatera layouten, så att man säkerställer att gjorda ändringar blir synliga.

arcpy.RefreshActiveView()

Nu har du vad du behöver för att starta med din egen layout. Det går enkelt att modifiera skriptet så att en massa texter i layouten ändras via formulär. Det går med lite mera arbete att skapa texter med dagens datum med flera bearbetade variabler, och med ytterligare arbete så är det inte så svårt att hantera panoreringar och zoom genom att mata in koordinater i formuläret, eller zooma till en utvald shapefil.

Vill du köra skriptet utan att ha ArcMap igång?

Byt ut ”Current” mot den kompletta sökvägen till mxd-projektet och lägg till mxd.save() sist i skriptet. Du måste dock ha ArcMap installerat på datorn.

Kör sedan skriptet med kommandot python skriptnamn.py argument0 argument1 argument2 i ett kommandofönster. Nästa gång du öppnar mxd-projektet så skall det vara uppdaterat. Eller varför inte lägga till export till PDF i skriptet?

Lycka till.

[EDIT]

Några fel smög in sig i skriptet, detta är nu rättat och det finns ett nytt att ladda hem nedan. När jag kopierade texten så fick jag dock byta ut ” tecknen för att det skulle fungera. Om det ändå strular så ersätt # tecknen också. Det blir något problem när pdf filen skapas med dessa tecken.

test.py

Programmering för Geosupport

När jag var ”yngre” så höll jag på mycket med programmering i visual basic. Jag gjorde bland annat olika GPS program för att samla in data från anslutna GPS mottagare, något som det finns en uppsjö av program som klarar av idag.

Håller man på med GIS så är kanske inte det första man tänker på är att lära sig programmering. Men många uppgifter är repetitiva och man skulle tjäna en massa tid på att utföra dessa mera automatiskt.

Makron och liknande (exempelvis modelbuilder i ArcGIS) är bra till en viss gräns, men mer specifika och avancerade uppgifter blir svåra att klara av enbart med makron, och då är det någon form av programmering som krävs.

Om man är nybörjare, eller som jag har lite väl gamla erfarenheter, så rekommenderar jag att man använder Python som programspråk. Det är förhållandevis enkelt att lära sig, och många GIS program har inbyggt stöd för att köra denna typ av kod (exempelvis ArcGIS).

Om det således saknas ett verktyg i modelbuilder, så kan man med Pythonkod skapa sitt eget.

Jag har exempelvis skrivit ett eget Pythonskript som läser GPS loggar i NMEA format och sparar valda delar som attribut i ett vektorlager. Arbetet med detta tog inte många timmar, och då började jag med att lära mig vad Python egentligen var och hur man använde det.