Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Python: get GPS latitude and longitude coordinates from JPEG EXIF using exifread
import exifread
# based on https://gist.github.com/erans/983821
def _get_if_exist(data, key):
if key in data:
return data[key]
return None
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 get_exif_location(exif_data):
"""
Returns the latitude and longitude, if available, from the provided exif_data (obtained through get_exif_data above)
"""
lat = None
lon = None
gps_latitude = _get_if_exist(exif_data, 'GPS GPSLatitude')
gps_latitude_ref = _get_if_exist(exif_data, 'GPS GPSLatitudeRef')
gps_longitude = _get_if_exist(exif_data, 'GPS GPSLongitude')
gps_longitude_ref = _get_if_exist(exif_data, 'GPS GPSLongitudeRef')
if gps_latitude and gps_latitude_ref and gps_longitude and gps_longitude_ref:
lat = _convert_to_degress(gps_latitude)
if gps_latitude_ref.values[0] != 'N':
lat = 0 - lat
lon = _convert_to_degress(gps_longitude)
if gps_longitude_ref.values[0] != 'E':
lon = 0 - lon
return lat, lon
@rudyvogt

This comment has been minimized.

Copy link

commented Jan 23, 2017

very helpful code

@JoeDevlin

This comment has been minimized.

Copy link

commented Jul 14, 2017

Thanks for this! I cant seem to actually return or print the coordinates to terminal, how can I do that?

@ryanmeasel

This comment has been minimized.

Copy link

commented Nov 1, 2018

There is no get_exif_data in this gist.

@bcjarrett

This comment has been minimized.

Copy link

commented Dec 27, 2018

@ryanmeasel

def get_exif_data(image_file):
    with open(image_file, 'rb') as f:
        exif_tags = exifread.process_file(f)
    return exif_tags 

lat, long = get_exif_location(get_exif_data(image_file))
@bcjarrett

This comment has been minimized.

Copy link

commented Dec 27, 2018

I also added altitude:

gps_altitude_ref = _get_if_exist(exif_data, 'GPS GPSAltitudeRef')
gps_altitude = _get_if_exist(exif_data, 'GPS GPSAltitude')

if gps_altitude and gps_altitude_ref:
     alt = gps_altitude.values[0]
     altitude = alt.num / alt.den
     if gps_altitude_ref.values[0] == 1: altitude *= -1

return lat, lon, altitude
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.