Extraia uma faixa de GPS (como .gpx) de uma série de fotos jpg

3

Eu tenho um monte de .jpgfotos contendo informações de GPS. Qual é a maneira mais fácil de extrair as informações do GPS e salvá-las em um .gpxarquivo (ou .kml, nesse caso)?

Vi esta resposta apontando para exiftooluma saída legível, mas gostaria de importar a faixa para outros aplicativos (por exemplo, Oruxmaps ou Google Maps). As respostas a esta pergunta no gis.stackexchange.com apontam para programas do Windows, mas estou procurando uma alternativa utilizável no Mac OSX.

Jan Eglinger
fonte
A execução de uma ferramenta do Windows em um wrapper para o OS X seria boa ou você procura apenas uma ferramenta nativa?
grg
@GeorgeGarside Claro, uma ferramenta do Windows em um invólucro serviria. Se é mais fácil, em seguida, mão-elaborar um script que usa exiftool e produz uma saída xml ..
Jan Eglinger

Respostas:

2

Exiftool será a maneira mais fácil de fazer isso.

Aqui está um script que gera saída KML para uma lista de imagens. Você pode modificar isso se desejar um caminho KML, etc ...

#! /usr/bin/env python
# -*- coding: utf-8 -*-

""" 
Create a KML file based on exif data

Requires exiftool to have been installed    
Usage: exif2kml.py *.jpg > output.kml

"""

import os
import sys
import re
import time

def decimalat(DegString):
    # This function requires that the re module is loaded
    # Take a string in the format "34 56.78 N" and return decimal degrees
    SearchStr=r''' *(\d+) deg (\d+)' ([\d\.]+)" (\w)'''
    Result = re.search(SearchStr, DegString)

    # Get the (captured) character groups from the search
    Degrees = float(Result.group(1))
    Minutes = float(Result.group(2))
    Seconds = float(Result.group(3))
    Compass = Result.group(4).upper() # make sure it is capital too

    # Calculate the decimal degrees
    DecimalDegree = Degrees + Minutes/60 + Seconds/(60*60)
    if Compass == 'S' or Compass == 'W':
        DecimalDegree = -DecimalDegree  
    return DecimalDegree

def writePlace(filename,lat,lon,date):
    PlacemarkString = '''
    <Placemark>
     <name>{0}</name>
     <Point>
      <altitudeMode>absolute</altitudeMode>
      <coordinates>{1}, {2}</coordinates>
      <TimeStamp>
        <when>{3}</when>
      </TimeStamp>
     </Point>
    </Placemark>'''.format(filename,lat,lon,date)
    return PlacemarkString 

HeadString='''<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<kml xmlns=\"http://earth.google.com/kml/2.2\">
<Document>'''

if len(sys.argv)<2:
    print >> sys.stderr, __doc__

else:
    placestring = ''
    FList = sys.argv[1:]
    for F in FList:
        ExifData=os.popen('exiftool "'+ F +'" -DateTimeOriginal -GPSLatitude -GPSLongitude').read()
        if "Longitude" in ExifData:
            print >> sys.stderr, F,"\n",ExifData.rstrip()
            Fields = ExifData.split("\n")
            for Items in Fields:
                if len(Items)> 10:
                    K,V = Items.split(" : ")
                    if "Latitude" in K:
                        lat = decimalat(V)
                    elif "Longitude" in K:
                        lon = decimalat(V)
                    elif "Date" in K:
                        date = time.strptime(V.strip(),"%Y:%m:%d %H:%M:%S")  # time format
            if lat:
                TimeFmt = "%Y-%m-%dT%H:%M:%S"
                placestring += writePlace(F,lon,lat,time.strftime(TimeFmt,date))
                lat = ''
    # Generate the output file...
    # This just prints to screen -- use > to capture to file...
    print HeadString
    print placestring
    print """</Document>\n</kml>"""
beroe
fonte
Muito obrigado por este script! Eu me pergunto por que, aparentemente, nenhuma desenvolvedor de aplicações saltou para esse nicho ainda, para desenvolver um bom ISomething GUI para extrair faixas de álbuns de fotos etc ... :)
Jan Eglinger
Sim, esse tipo de "juntar x dados ao formato y" acaba sendo bastante útil. Consegui mesclar partes de outros scripts existentes para fazer isso. Não verificou o campo de data dos marcadores, por isso, verifique novamente se isso é importante para você. Se você quer fazer um passeio, você provavelmente poderia até mesmo adicionar a capacidade das imagens aparecem como miniaturas ao longo de uma rota, etc.
Beroe
1

O próprio exiftool agora também pode gerar arquivos GPX . Você pode fazer o download do gpx.fmtmodelo no site exiftool e executar

exiftool -p ./gpx.fmt *JPG > output.gpx

Algumas opções úteis:

  1. -ifcria exiftoolapenas arquivos de processo com uma tag gps,
  2. -fileOrder permite o processamento em uma ordem forçada,
  3. -d permite formatar a cadeia de dados.

Por exemplo:

exiftool -if '$gpsdatetime' -fileOrder gpsdatetime -p ./gpx.fmt -d %Y-%m-%dT%H:%M:%SZ *JPG > output.gpx
Tim
fonte