Извлечь трек GPS (как .gpx) из серии фотографий JPG

3

У меня есть куча .jpg фотографии, содержащие информацию GPS. Какой самый простой способ извлечь информацию GPS и сохранить ее в .gpx файл (или .kml, в этом отношении)?

я видел этот ответ указывая на exiftool, который дает читабельный вывод, но я хотел бы импортировать трек в другие приложения (например, Oruxmaps или Google Maps). Ответы на этот вопрос на gis.stackexchange.com указывают на программы Windows, но я ищу полезную альтернативу для Mac OSX.

Jan Eglinger
источник
Будет ли работать инструмент Windows в оболочке для OS X или вы ищете только нативный инструмент?
grg
@ GeorgeGarside Конечно, инструмент Windows в обертке подойдет. Если это проще, то создайте вручную скрипт, который использует exiftool и производит вывод xml.
Jan Eglinger

Ответы:

2

Exiftool будет самым простым способом сделать это.

Вот скрипт, который генерирует вывод KML для списка изображений. Вы можете изменить это, если хотите путь KML и т. Д.

#! /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
источник
Большое спасибо за этот скрипт! Интересно, почему ни один разработчик приложений не запрыгнул в эту нишу, чтобы создать хороший iSomething GUI для извлечения треков из фотоальбомов и т.д ... :)
Jan Eglinger
Да, этот тип «объединения данных x в формат y» оказывается весьма полезным. Я смог объединить фрагменты других существующих сценариев, чтобы сделать это. Не проверяли поле даты меток, поэтому вы можете проверить еще раз, если это важно для вас. Если вы хотите совершить экскурсию, вы могли бы даже добавить возможность отображения изображений в виде миниатюр вдоль маршрута и т. Д.
beroe