Extraiga una ruta GPS (como .gpx) de una serie de fotos jpg

Tengo un montón de .jpgfotos que contienen información de GPS. ¿Cuál es la forma más fácil de extraer la información del GPS y guardarla en un .gpxarchivo (o .kml, para el caso)?

He visto esta respuesta apuntando a exiftool, lo que da un resultado legible, pero me gustaría importar la pista a otras aplicaciones (por ejemplo, Oruxmaps o Google Maps). Las respuestas a esta pregunta en gis.stackexchange.com apuntan a los programas de Windows, pero estoy buscando una alternativa utilizable en Mac OSX.

¿Estaría bien ejecutar una herramienta de Windows en un contenedor para OS X o está buscando únicamente una herramienta nativa?
@GeorgeGarside Claro, una herramienta de Windows en un envoltorio serviría. Si es más fácil, entonces hacer a mano un script que use exiftool y produzca una salida xml.

Respuestas (2)

Exiftool va a ser la forma más fácil de hacer esto.

Aquí hay una secuencia de comandos que genera una salida KML para una lista de imágenes. Puede modificar esto si desea una ruta 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>"""
¡Muchas gracias por este guión! Me pregunto por qué aparentemente ningún desarrollador de aplicaciones saltó a ese nicho todavía, para desarrollar una buena GUI de iSomething para extraer pistas de álbumes de fotos, etc. :)
Sí, este tipo de "unir datos x a formato y" termina siendo bastante útil. Pude fusionar piezas de otros scripts existentes para hacer esto. No revisé el campo de fecha de las marcas de posición, por lo que es posible que desee volver a verificar, si eso es importante para usted. Si desea hacer un recorrido, probablemente podría incluso agregar la capacidad de que las imágenes se muestren como miniaturas a lo largo de una ruta, etc.

El propio exiftool ahora también puede generar archivos GPX . Puede descargar la gpx.fmtplantilla del sitio web exiftool y luego ejecutar

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

Algunas opciones útiles:

  1. -ifhace que exiftoolsolo procese archivos con una etiqueta gps,
  2. -fileOrderpermite el procesamiento en un orden forzado,
  3. -dpermite formatear la cadena datatime.

Por ejemplo:

exiftool -if '$gpsdatetime' -fileOrder gpsdatetime -p ./gpx.fmt -d %Y-%m-%dT%H:%M:%SZ *JPG > output.gpx
De hecho, lo uso exiftool ocasionalmente, y no sabía que tenía esta capacidad, ¡increíble! Personalmente, creo que el verdadero valor de esto es proporcionar puntos de datos que pueden integrarse con un archivo de seguimiento GPX existente. He estado buscando un reemplazo para la aplicación abusiva AllTrails y esta parece ser una forma razonable de hacerlo.
Si está extrayendo datos de un iPhone, debe usar este archivo de formato GPX en su lugar. gist.github.com/reedriley/6051055