2011-06-23 14 views
5

używam następujący kod, aby wyodrębnić geolokalizacji zrobionego zdjęcia z iPhone:Przekłada Exif DMS do DD Geolokalizacja z Pythonem

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 

Jest to wynik, że jestem zwrócony:

{ 
    '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' 
} 

Zastanawiam się więc, w jaki sposób przekonwertować wartości GPSInfo (DMS) na stopnie dziesiętne dla rzeczywistych współrzędnych? Wydaje się również, że są dwa Wests. . . ?

Odpowiedz

8

Oto sposób na to, przystosowane do skryptu pisałem kilka miesięcy temu przy użyciu 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 

To daje mi następujące szerokości i długości geograficznej na obraz: 32.7618333, -117.146333 (te same wyniki jak Lance Lee).

Ostatni wpis GPSInfo może być nagłówkiem obrazu. Można to sprawdzić za pomocą narzędzia, które nadaje nazwy różnym wartościom EXIF, np. Exiv2 lub exiftools.

1

http://www.exiv2.org/tags.html znajdź ciąg "Exif.GPSInfo.GPSLatitude" na tej stronie. Wygląda na to, że otrzymujesz 3 pary (reprezentujące wartości wymierne), a druga liczba w parze jest mianownikiem. Spodziewam się, że rzecz po Longitude będzie wysokością, jednak jest to lepsze dopasowanie do znacznika GPS.

W tym przykładzie:

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

Czy to zdjęcie zrobione w pobliżu 4646 Park Blvd, San Diego, CA 92116? Jeśli nie, zignoruj ​​tę odpowiedź.