Utöka GIS med Python – Del 3

Då var det dags att bygga in pythonskriptet från i måndags i ArcMap.

Principen liknar den för QGIS men skiljer sig på ett antal punkter. En del är betydligt enklare, medan annat är obegripligt omständligt.

När du läst färdigt så vet du (ungefär) hur du tar ett skript i python och skapar en dialogruta med ifyllnadsfält som in-data till skriptet, samt kör detta genom ArcToolbox eller i andra processer i ArcGIS.

För det första så behöver man en ”toolbox” att jobba i. Denna kan skapas i ArcToolbox eller i ArcCatalog. I toolboxen lägger man sedan till ett skript från fil (högerklicka på toolboxen), vilket startar en guide för detta.

skapaSkript

Här fyller man i ett namn på skriptet, vilken etikett det skall ha samt en beskrivning. Beskrivningen kommer sedan att synas i hjälpen för verktyget.

Man pekar ut skriptfilen och sedan anger man vilka fält som skall gå att fylla i när verktyget körs.

variabler.PNG

Detta påminner om hur man gör i QGIS, men är mera grafiskt i ArcMap. Här är det viktigt att tänka på vilken ordning man placerar datatyperna, samt att man väljer typer av rätt ”typ”.

Det går att ange filter för filtyper (exempelvis *.tif) om man vill det, eller standardvärden (som 1000 för pixelvärde).

Om man nu är optimist och kör skriptet så är det stor sannolikhet att det blir ett felmeddelande. ArcGIS använder nämligen en egen Python tolk, och struntar i om det finns andra installerade på datorn. Har du därför installerat GDAL via OSGeo4W, så har du sannolikt ytterligare ett pythonbibliotek liggande någonstans, där GDAL fungerar.

Det finns dock lösningar och en jag hittade på nätet kan läsa genom att klicka här.

Inte helt enkelt men lite kortfattat: Först måste du ta reda på lite om Python i ArcMap. Öppna pythontolken (Geoprocessing/Python) och skriv in print sys.version. Detta skriver ut Pythonversion och hur många bitar det är. I mitt fall var det Python 2.7 och 32-bitar.

Sedan går man till http://www.gisinternals.com/sdk/ och klickar på ”Stable Releases” följt av den senaste länk som motsvarar resultatet ovan (i mitt fall release-1800-gdal-1-11-3-mapserver-6-4-2″). Det är inte en ny version som finns där, men den är inte lastgammal heller.

Där hämtar och installerar man sedan ”rätt” gdal core och GDAL py. ”Core” installeras rätt av, medan GDAL py måste installeras anpassat på samma sökväg som ArcGIS använder. För att ta reda på detta skriver du print sys.path i Pythonfönstret i ArcMap. I mitt fall var det ”C: \Python27\ArcGIS10\”.

Välj denna sökväg vid installationen av GDAL py.

Sedan har man möjligen ett problem. Om man har exempelvis QGIS installerat, som använder standard GDAL installationen, så får man välja om man vill använda ArcGIS eller QGIS (varför ESRI! Varför!!!). Du måste nämligen ändra en miljövariabel så att GDAL_PATH pekar på den nyss installerade GDAL versionen ( i mitt fall var detta C:\Program Files (x86)\GDAL\gdal-data). Man måste även lägga till en sökväg till GDAL katalogen i systemvariabeln PATH. Vill man ha GDAL i både ArcGIS och QGIS så får man sedan ändra detta från gång till gång… (kan hända att QGIS fungerar med ”ArcGIS” inställningen också, men ”be warned”). Detaljer om allt detta finns på webbsidan som jag länkade till ovan.

Tillbaka till skriptet.

Ja, eller någon modifiering behövs egentligen inte. Paketeringen av skript i ArcGIS med de variabler som fylldes i tidigare, överförs som standard systemvariabler till skriptet (sys.argv[x]). Så länge vi ser till att formuläret har variablerna i rätt ordning och av rätt typ så är allt klart.

När skriptet körs så hämtas en utpekad rasterfil. Den klipps i mindre bitar med bredd/höjd i angiven pixelstorlek, och sparas på angiven plats.

Det går även att skapa ytterligare ”hjälptexter” på samma sätt som i QGIS, genom att högerklicka på skriptet och välja ”Item description”.

Det här skriptet kan också användas i nya toolboxar och modeller för att bygga på funktionalitet på samma sätt som i QGIS (”Same-same, but different”).

Slutsatser

Några reflektioner då från dessa dagar med Python och GIS. Det går att göra väldigt mycket med olika terminalprogram i Python, och GIS program har ett väl fungerande stöd för att skriva skript i Python.

I fallet med ArcGIS så spelar det inte så snällt med andra program som vill använda exempelvis GDAL och man får jobba en hel del med att få till allt.

I QGIS så fungerar Pythonkopplingarna till GDAL perfekt, men där får man modifiera skriptet något för att integrationen skall fungera med programmet. Däremot är det inte mycket som behöver göras i QGIS i sig, mer än att importera skriptet.

Skripten i QGIS och ArcGIS är i praktiken väldigt lika. Det skiljer bara på hur man tar in parametrarna i skriptet, där ArcGIS följer Python standard. Om man kunde detektera i skriptet vilket program som anropar det så skulle man faktiskt kunna köra samma skript i både QGIS och ArcMap…

Vänta lite!

if any("qgis2" in item for item in sys.path) then
   {läs in variabler med ## för QGIS processing}
else
   {läs in variabler med sys.argv[x] för ArcGIS och terminalen}
end if

Nu kan man alltså använda skriptet såväl fristående från terminalen som från QGIS och ArcMap… Varför skriver inte alla Pythonskript såhär? Egentligen handlar det väl om att vi som skriver Pythonskript för QGIS, kanske skall börja anpassa våra skript så att de enkelt kan köras även på ArcGIS. ArcGIS använder trots allt standard i sin hantering av Python.

Vill man baka in ArcPy eller PyQGIS så kan man anpassa skripten på motsvarande sätt. Det kan finnas ett bättre och säkrare sätt att testa om skriptet körs genom ett specifikt program, men det här var det sätt jag hittade just nu.

Annonser

Taggar:,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: