Tengo un montón de .jpg
fotos 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 .gpx
archivo (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.
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>"""
El propio exiftool ahora también puede generar archivos GPX . Puede descargar la gpx.fmt
plantilla del sitio web exiftool y luego ejecutar
exiftool -p ./gpx.fmt *JPG > output.gpx
Algunas opciones útiles:
-if
hace que exiftool
solo procese archivos con una etiqueta gps,-fileOrder
permite el procesamiento en un orden forzado,-d
permite formatear la cadena datatime.Por ejemplo:
exiftool -if '$gpsdatetime' -fileOrder gpsdatetime -p ./gpx.fmt -d %Y-%m-%dT%H:%M:%SZ *JPG > output.gpx
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.
grg
Jan Eglinger