Under veckan som gick ställdes jag inför ett bekymmer som handlade om att göra om stora mängder fotografier till geodata (geotaggade foton). Inte bara det, utan det skulle göras med en befintlig arkitektur i ett låst system.
Jag kan avslöja redan nu att så fungerar inte datorvärlden och mitt fortsatta arbete gick ut på att försöka hitta en metod som innebar så lite förändringar som möjligt.
GPS informationen i bilderna finns lagrade i EXIF informationen i bilderna där ett antal ”taggar” hanterar data relaterade till detta.
För att läsa EXIF så behövs någon form av programbibliotek som löser detta, och något befintligt sådant har jag inte hittat i den miljö där funktionen skall användas.
Geodata hanteras i ArcGIS, så det naturliga var att titta på om det går att skapa ett verktyg i Python för detta. Det finns verktyg som ”ArcPhotoTools” men detta är ett ”tillägg” som inte är helt enkelt att lägga till i ett definierat system. Dessutom så fungerar det inte speciellt bra för att automatisera import av stora mängder bilder.
För att läsa EXIF i Python så kan man använda exempelvis ”exifread” eller ”PIL”. Python Image Library (PIL) är säkert bra, men det har inte skett någon utveckling på runt sju år så därför tittade jag främst på exifread i stället.
Exifread är ett bibliotek med BSD licens, vilket innebär att man kan använda källkoden fritt utan krav på att bifoga källkoden i resulterande system. (ExifRead)
I linux är det enkelt att installera pythonbibliotek via Internet. Har man Internet är det inte mycket svårare med Windows. Har man bara ”PIP” så kan man installera massor av tillägg till Python, men nu har jag vare sig Internet eller PIP.
Då blir det till att hämta källkoden och installera manuellt. Installationen av exifread kräver dessutom ”SetupTools” så även källkoden för detta behövs (SetupTools). Installationen av SetupTools sker på samma sätt.
Från den uppackade katalogen med källkod så skriver man in i ett terminalfönster:
C:\> python setup.py install
Detta görs med först SetupTools och sedan ExifRead, därefter kan man testa om det fungerar:
C:\> python >>> import exifread
Om man inte får något felmeddelande så är det klart!
Ett problem i mitt fall är att installationen kräver administratörsbehörighet. Kan man komma runt det så är detta det bästa sättet, men som jag återkommer till mot slutet så finns det alternativ som inte kräver installation.
ExifRead
Att gå igenom filer i en katalog med Python är ganska väl beskrivet på andra platser så det hoppar jag över. Det som är intressant i sammanhanget är just kommandot ExifRead.
import exifread fil = open(sökväg_till_fil, 'rb') taggar = exifread.process_file(fil)
”taggar” är ett dictionary med ”nyckel”-”värde” par man kan söka igenom, eller om man vet vilka nycklar man är ute efter så kan dessa anropas direkt.
Om det finns GPS information i bilden så kan exempelvis följande nycklar användas:
- ”GPS GPSLongitudeRef”
- ”GPS GPSLongitude”
- ”GPS GPSLatitudeRef”
- ”GPS GPSLatitude”
Svaret på ”print(taggar[”GPS GPSLongitude”])” är en ”lista” med grader, minuter och sekunder i bråkform, vilket sedan kan omvandlas till decimalagrader.
Till Geodata…
Då kan jag söka igenom en katalog, filtrera ut ”jpg/jpeg” bilder, läsa exif och hämta GPS positionen från dessa data. För att skriva till geodata så använder jag de inbyggda funktionerna i ArcPy, så det hoppar jag över här. Däremot så tänkte jag vidareutveckla skriptet i morgon för att även skapa geodata i skript.
Ja just det…
Du behöver faktiskt inte installera ExifRead på klienten om du inte vill att biblioteken inte skall vara tillgängligt hela tiden. Det går även bra att ha katalogen ”exifread” från källkoden i den katalog där man exekverar pythonkoden. Detta gör att jag kan komma runt behovet av att ”installera” bibliotek på en klient. Koden kan därför bara köras när jag vill att den skall köras. Detta är nog inte fullt ut acceptabelt bland våra värsta foliehattar, men enda alternativet är att inte alls tillåta exekvering av kod som inte är granskad, vilket inte är acceptabelt över huvud taget.
kanske FME?
http://bbox.me/blog/?p=314
Du går händelserna i förväg 😀
Intressant!
Har du testat verktyget ”Geotagged photos to points” i ArcGIS?
http://pro.arcgis.com/en/pro-app/tool-reference/data-management/geotagged-photos-to-points.htm
Lite problemlösning:
https://geonet.esri.com/thread/80498
Målsystemet har ArcGIS 10.0 så detta hjälper tyvärr inte!