Hoppa till innehåll
Meny
  • Hem
  • Dokument
  • Om Mig
Geosupportsystem

Allt i Python, ändå…

Publicerat den 2016-08-17

Nu har jag i två inlägg presenterat hur jag jobbat med Python och ExifRead för att läsa GPS-taggar i bilder för att skapa GIS data baserat på detta. Resultatet efter det andra inlägget var i praktiken att jag jobbat i onödan då allt faktiskt går att göra i FME. Vilket är en mjukvara som jag har tillgång till i den miljö där funktionen efterfrågas.

Nu har inte alla FME, och sedan så har jag inte vägt in hur lång tid körningarna tar heller, så därför kommer det här:

# -*- coding: utf-8 -*-

'''
Detta är ett Python skript av Klas Karlsson

Användning: Tar exakt ett argument (sökväg/text)

Skriptet söker igenom skriptet efter jpg/jpeg bilder och
kontrollerar om dessa har GPS information i EXIF-informationen

Kräver: exifread
'''

import exifread
import sys
import os
import time

# Visa hjälp om photo2tab.py --help
try:
    if sys.argv[1] == "--help":
        print("\nHjälp för photo2tab\n===================\n\n\
Skriptet tar ett argument!\nNämligen sökvägen att leta efter foton i.\n\
På sökvägen skapas en fil med namnet photo2.tab med resultatet av sökningen.\n\n\
Filen är en tab-separerad textfil med bl.a. position, eventuell riktning \noch sökväg till \
bilden. \n\nOm du inte anger sökväg så blir du tillfrågad om vilken sökväg som \
skall \nanvändas. Om du inte har skrivrättigheter i den katalogen så blir du \ntillfrågad \
om var du vill att filen skall sparas.\n\n\
Skriptet är gjort av Klas Karlsson 2016-08-13\n\
Beroende av: ExifRead.\n\n\n")
        sys.exit()
except:
    pass
    
# Finns det en sökväg i argumentet?
try:
    folder_path = str(sys.argv[1])
except:
    folder_path = raw_input("Sökväg att leta i: ")
print( "\nSöker igenom: %s ..." % folder_path )

# Skapa tab-fil att skriva data till
try:
    save_path = folder_path
    tab_file = open(os.path.join(save_path, "photo2.tab"), "w")
except:
    save_path = raw_input("Var skall resultatet sparas? ")
    tab_file = open(os.path.join(save_path, "photo2.tab"), "w")
tab_file.write("id\tlongitude\tlongRef\tlatitude\tlatRef\timgDir\tgpsTime\tcameraTime\timgPath\n")

# Göra om dms lista till D.ddd
def dms2ddd(dms):
    deg = float(dms.values[0].num) / float(dms.values[0].den)
    min = float(dms.values[1].num) / float(dms.values[1].den)
    sec = float(dms.values[2].num) / float(dms.values[2].den)
    return(deg + min/60.0 + sec/3600.0)

# Göra om GPS tid till text
def time2string(time):
    h = str(time.values[0].num)
    m = str(time.values[1].num)
    s = str(int(time.values[2].num/time.values[2].den))
    hh = "0" + h
    mm = "0" + m
    ss = "0" + s
    return("%s:%s:%s" % (hh[-2:], mm[-2:], ss[-2:]))

# Ange starttidpunkt
time_start = time.time()

# Skapa katalogobjektet
photos = os.listdir(folder_path)
countTagged = 0
countPhotos = 0
countFiles = 0
GPSLongitude = "" # Definieras för att vara testflagga
for root, dirs, files in os.walk(folder_path, topdown=False): # Alla filer och underkataloger
    for photo in files: # Gå igenom alla filer i alla kataloger
        countFiles += 1
        if photo.lower().endswith(".jpg"): # testa om filen slutar med jpg/JPG
            countPhotos += 1
            photo_path = os.path.join(root, photo) # Skapa fullständig sökväg till bilden
            f = open(photo_path, "rb") # Öppna bildfilen
            tags = exifread.process_file(f) # Hämta alla exif taggar
            for tag in tags.keys(): # Gå igenom taggar, men hoppa över några
                if tag not in ('JPEGThumbnail', 'TIFFThumbnail', 'Filename', 'EXIF MakerNote'):
                    if tag == "GPS GPSLongitude":
                        GPSLongitude = dms2ddd(tags[tag])
                        countTagged += 1
                    if tag == "GPS GPSLongitudeRef":
                        GPSLongitudeRef = str(tags[tag])
                    if tag == "GPS GPSLatitude":
                        GPSLatitude = dms2ddd(tags[tag])
                    if tag == "GPS GPSLatitudeRef":
                        GPSLatitudeRef = str(tags[tag])
                    if tag == "GPS GPSImgDirection":
                        GPSImgDirection = float(tags[tag].values[0].num) / float(tags[tag].values[0].den)
                    if tag == "GPS GPSTimeStamp":
                        GPSTimeStamp = time2string(tags[tag])
                    if tag == "EXIF DateTimeDigitized":
                        DateTimeDigitized = tags[tag]
            f.close() # Stäng bildfilen
            if str(GPSLongitude) != "": # Om det är en bild med GPS info så...
                if GPSLatitudeRef == "S":
                    GPSLatitude = 0 - GPSLatitude
                if GPSLongitudeRef == "W":
                    GPSLongitude = 0 - GPSLongitude
                tab_file.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (str(countTagged), \
                str(GPSLongitude), str(GPSLongitudeRef), \
                str(GPSLatitude), str(GPSLatitudeRef), str(GPSImgDirection), str(GPSTimeStamp), \
                str(DateTimeDigitized), str(photo_path)))
                GPSLongitude = ""    # Återställ flagga    
        print("\r%s Filer och kataloger. %s Bilder. %s med GPS positioner." % \
        (countFiles, countPhotos, countTagged)), # Skriv ut processens status på skärmen

# Stänger tab-filen
tab_file.close() # Stäng photo2.tab filen

# Räknar ut hur lång tid allt tog
time_end = time.time() # Sätt sluttiden
time_process = (time_end - time_start) # Räkna ut hur lång tid allt tog
if time_process < 60.0:
    print("\nProcessen tog %s sekunder" % str(int(time_process)))
elif time_process < 3600.0:
    min = int(time_process/60.0)
    sec = int(time_process - min*60.0)
    print("\nProcessen tog %s minuter och %s sekunder" % (min, sec))
else:
    hour = int(time_process/3600.0)
    min = int(time_process - hour*3600)
    print("\nProcessen tog %s timmar och %s minuter" % (hour, min))
print("Filen \"photo2.tab\" skapad på sökvägen: %s" % save_path)

Jag tänker inte kommentera så mycket mera.

Jag har lagt in tidtagning i skriptet, mest för att jag vill jämföra hur lång tid en motsvarande körning i FME tar. Inte minst intressant om det är mycket stora mängder bilder som skall gås igenom. I samband med detta får jag även påtala att jag nu inte ”trådat” skriptet, men vad jag kommer ihåg så gör inte FME det heller som standard.

(När jag sökte genom hela min dator så hittade den 18 taggade foton av 389 bilder, bland 566’300 filer totalt, på 1 minut och 10 sekunder…)

Det här skriptet använder jag med namnet ”photo2tab.py” och jag har det i en katalog tillsammans med exifread. Detta gör att så länge det finns Python installerat på datorn jag använder så kan jag söka efter och skapa datafiler för alla bilder på utpekade sökvägar.

Jag har försökt bygga in lite felhantering men det är säkert inte komplett, speciellt inte då jag faktiskt ännu inte provat på en Windowsdator (eller Mac).

Om du vill använda skriptet så är det som vanligt så att det inte går att garantera hur WordPress hanterar olika tecken. Därför är det nog säkrare att använda filen från GitHub: photo2tab.py

Jag har redigerat skriptet sedan detta skrevs och därför så är det inte säkert att skriptet på GitHub är samma som visas ovan. Om något så har problem och buggar rättats till och funktioner tillförts. Det är mindre sannolikt att något blivit ”sämre”.

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Translate with Google

GBR In English
GER Auf Deutch
FRA En Français
ESP En Español
Swedish is a hard language for a machine to translate. Nuance and detail will likely be lost.
     Mastodon  

Bok om QGIS på Svenska

Bok

Beställ Boken/E-bok genom att klicka på bilden (även förhandsgranskning).

Senaste kommentarer

  • Daniel Nilsson om QField
  • denis Empisse om SpaceMouse Python
  • klakar om SpaceMouse Python
  • Anders Jackson om Återbesök, WebODM
  • Anders Jackson om SpaceMouse Python

Arkiv

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
©2025 Geosupportsystem | WordPress-tema av Superbthemes.com