Interpreting GPS info of exif data from photo in python

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I am writing a small program to get the GPS info of a iphone jpg photo.

The library I am using is the PIL in python. Now I am able to get the GPSInfo, which is something like:

{1: 'N',   2: ((1, 1), (20, 1), (5365, 100)),   3: 'E',   4: ((103, 1), (41, 1), (1052, 100)),   5: 0,   6: (43, 1),   7: ((15, 1), (32, 1), (7, 1)),   16: 'T',   17: (77473, 452),   29: '2013:10:25'} 

How can I interpret this? And I notice the tag is not continuous, so is there any cheating sheet which I can refer to in order to get a better understanding of all the number tags and what they mean? Thank you!

UPDATES

Sorry, I have figured it out. In the PIL lib, there is a GPSTAGS.get() function which can help me decode the key in gps info. Thank you guys!

gpsinfo = {} for key in exif['GPSInfo'].keys():     decode = ExifTags.GPSTAGS.get(key,key)     gpsinfo[decode] = exif['GPSInfo'][key] print gpsinfo 

and here is the result

{'GPSTimeStamp': ((15, 1), (32, 1), (7, 1)),   'GPSImgDirectionRef': 'T',   'GPSImgDirection': (77473, 452),   'GPSLongitude': ((103, 1), (41, 1), (1052, 100)),   'GPSLatitudeRef': 'N', 29: '2013:10:25',   'GPSAltitude': (43, 1),   'GPSLatitude': ((1, 1), (20, 1), (5365, 100)),   'GPSLongitudeRef': 'E',   'GPSAltitudeRef': 0} 

回答1:

Use exifread module.

Here is a very helpful gist

import exifread as ef   # barrowed from  # https://gist.github.com/snakeye/fdc372dbf11370fe29eb  def _convert_to_degress(value):     """     Helper function to convert the GPS coordinates stored in the EXIF to degress in float format     :param value:     :type value: exifread.utils.Ratio     :rtype: float     """     d = float(value.values[0].num) / float(value.values[0].den)     m = float(value.values[1].num) / float(value.values[1].den)     s = float(value.values[2].num) / float(value.values[2].den)      return d + (m / 60.0) + (s / 3600.0)   def getGPS(filepath):     '''     returns gps data if present other wise returns empty dictionary     '''     with open(filepath, 'r') as f:         tags = ef.process_file(f)         latitude = tags.get('GPS GPSLatitude')         latitude_ref = tags.get('GPS GPSLatitudeRef')         longitude = tags.get('GPS GPSLongitude')         longitude_ref = tags.get('GPS GPSLongitudeRef')         if latitude:             lat_value = _convert_to_degress(latitude)             if latitude_ref.values != 'N':                 lat_value = -lat_value         else:             return {}         if longitude:             lon_value = _convert_to_degress(longitude)             if longitude_ref.values != 'E':                 lon_value = -lon_value         else:             return {}         return {'latitude': lat_value, 'longitude': lon_value}     return {}   file_path = 'file path of the file'     gps = getGPS(file_path) print gps 


回答2:

OP, has already posted a solution using PIL. If you wants to just get GPS info from Python, you can get it by using exifread

Install package using pip

$ pip install exifread 

and get GPS data

In [10]: import exifread  In [11]: tags = exifread.process_file(open('./tests/demo-project/content/test.jpg', 'rb'))                                                In [12]: geo = {i:tags[i] for i in tags.keys() if i.startswith('GPS')}  In [13]: geo Out[13]:  {'GPS GPSAltitude': (0x0006) Ratio=186188/239 @ 898,  'GPS GPSAltitudeRef': (0x0005) Byte=0 @ 722,  'GPS GPSDate': (0x001D) ASCII=2015:12:06 @ 954,  'GPS GPSDestBearing': (0x0018) Ratio=43771/526 @ 946,  'GPS GPSDestBearingRef': (0x0017) ASCII=T @ 806,  'GPS GPSImgDirection': (0x0011) Ratio=43771/526 @ 938,  'GPS GPSImgDirectionRef': (0x0010) ASCII=T @ 782,  'GPS GPSLatitude': (0x0002) Ratio=[46, 3803/100, 0] @ 850,  'GPS GPSLatitudeRef': (0x0001) ASCII=N @ 674,  'GPS GPSLongitude': (0x0004) Ratio=[13, 2429/100, 0] @ 874,  'GPS GPSLongitudeRef': (0x0003) ASCII=E @ 698,  'GPS GPSSpeed': (0x000D) Ratio=139/50 @ 930,  'GPS GPSSpeedRef': (0x000C) ASCII=K @ 758,  'GPS GPSTimeStamp': (0x0007) Ratio=[10, 37, 33] @ 906,  'GPS Tag 0x001F': (0x001F) Ratio=30 @ 966} 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!