2011-06-23 13 views
5

estoy usando el siguiente código para extraer la geolocalización de una imagen tomada con un iPhone:Traducir Exif DMS a DD Geolocalización con Python

from PIL import Image 
from PIL.ExifTags import TAGS 

def get_exif(fn): 
    ret = {} 
    i = Image.open(fn) 
    info = i._getexif() 
    for tag, value in info.items(): 
     decoded = TAGS.get(tag, tag) 
     ret[decoded] = value 
    return ret 

a = get_exif('photo2.jpg') 
print a 

Este es el resultado de que yo sea regresado:

{ 
    'YResolution': (4718592, 65536), 
    41986: 0, 
    41987: 0, 
    41990: 0, 
    'Make': 'Apple', 
    'Flash': 32, 
    'ResolutionUnit': 2, 
    'GPSInfo': { 
     1: 'N', 
     2: ((32, 1), (4571, 100), (0, 1)), 
     3: 'W', 
     4: ((117, 1), (878, 100), (0, 1)), 
     7: ((21, 1), (47, 1), (3712, 100)) 
    }, 
    'MeteringMode': 1, 
    'XResolution': (4718592, 65536), 
    'ExposureProgram': 2, 
    'ColorSpace': 1, 
    'ExifImageWidth': 1600, 
    'DateTimeDigitized': '2011:03:01 13:47:39', 
    'ApertureValue': (4281, 1441), 
    316: 'Mac OS X 10.6.6', 
    'SensingMethod': 2, 
    'FNumber': (14, 5), 
    'DateTimeOriginal': '2011:03:01 13:47:39', 
    'ComponentsConfiguration': '\x01\x02\x03\x00', 
    'ExifOffset': 254, 
    'ExifImageHeight': 1200, 
    'Model': 'iPhone 3G', 
    'DateTime': '2011:03:03 10:37:32', 
    'Software': 'QuickTime 7.6.6', 
    'Orientation': 1, 
    'FlashPixVersion': '0100', 
    'YCbCrPositioning': 1, 
    'ExifVersion': '0220' 
} 

Entonces, me pregunto cómo convierto los valores de GPSInfo (DMS) en grados decimales para las coordenadas reales? Además, parece haber dos Wests enumerados. . . ?

Respuesta

8

Aquí está una manera de hacerlo, adaptada para un guión que escribí hace unos meses usando pyexiv2:

a = get_exif('photo2.jpg') 
lat = [float(x)/float(y) for x, y in a['GPSInfo'][2]] 
latref = a['GPSInfo'][1] 
lon = [float(x)/float(y) for x, y in a['GPSInfo'][4]] 
lonref = a['GPSInfo'][3] 

lat = lat[0] + lat[1]/60 + lat[2]/3600 
lon = lon[0] + lon[1]/60 + lon[2]/3600 
if latref == 'S': 
    lat = -lat 
if lonref == 'W': 
    lon = -lon 

Esto me da la siguiente latitud y longitud para su imagen: 32.7618333, -117.146333 (mismos resultados que Lance Lee).

La última entrada de GPSInfo puede ser el encabezado de la imagen. Puede verificar esto usando una herramienta que da nombres propios a los diferentes valores EXIF ​​como exiv2 o exiftools.

1

http://www.exiv2.org/tags.html encuentra la cadena 'Exif.GPSInfo.GPSLatitude' en esa página. Parece que obtienes 3 pares (representando racionales) y el segundo número en el par es el denominador. Esperaría que la cosa después de Longitude sea la altitud, sin embargo, es una mejor opción para la marca de tiempo GPS.

En este ejemplo:

32/1 + (4571/100)/60 + (0/1)/3600 = 32.761833 N 
117/1 + (878/100)/60 + (0/1)/3600 = 117.146333 W 

Fue esta foto tomada cerca de 4646 Park Blvd, San Diego, CA 92116? Si no, entonces ignora esta respuesta.