Interpreting GPS info of exif data from photo in python
Late answer, but as of 2021 you can use GPSPhoto, i.e.:
from GPSPhoto import gpsphoto# Get the data from image file and return a dictionarydata = gpsphoto.getGPSData('IMG_20181224_201933.jpg')print(data['Latitude'], data['Longitude'])
Output:
38.71615498471598 -9.148730635643007
Installation:
pip3 install piexifpip3 install gpsphoto
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, 'rb') 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
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 exifreadIn [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]: geoOut[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}