Search code examples
pythongeolocationexif

Extracting gps coordinates from image using Python


Code:

from PIL import Image
from PIL.ExifTags import TAGS

# path to the image or video
imagename = "image.jpg"

# read the image data using PIL
image = Image.open(imagename)

# extract EXIF data
exifdata = image.getexif()

# iterating over all EXIF data fields
for tag_id in exifdata:
    # get the tag name, instead of human unreadable tag id
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # decode bytes
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

Output:

ExifVersion              : 0220
ComponentsConfiguration  : 
ShutterSpeedValue        : (1345, 100)
DateTimeOriginal         : 2020:08:27 09:43:15
DateTimeDigitized        : 2020:08:27 09:43:15
ApertureValue            : (185, 100)
BrightnessValue          : (930, 100)
ExposureBiasValue        : (0, 10)
MaxApertureValue         : (185, 100)
MeteringMode             : 2
Flash                    : 0
FocalLength              : (358, 100)
UserComment              : 
ColorSpace               : 1
ExifImageWidth           : 4128
SceneCaptureType         : 0
SubsecTime               : 0424
SubsecTimeOriginal       : 0424
SubsecTimeDigitized      : 0424
ExifImageHeight          : 1908
ImageLength              : 1908
Make                     : samsung
Model                    : SM-M305F
Orientation              : 6
YCbCrPositioning         : 1
ExposureTime             : (1, 2786)
ExifInteroperabilityOffset: 944
XResolution              : (72, 1)
FNumber                  : (190, 100)
SceneType                : 
YResolution              : (72, 1)
ImageUniqueID            : E13LLLI00PM E13LLMK03PA

ExposureProgram          : 2
CustomRendered           : 0
ISOSpeedRatings          : 40
ResolutionUnit           : 2
ExposureMode             : 0
FlashPixVersion          : 0100
ImageWidth               : 4128
WhiteBalance             : 0
Software                 : M305FDDU5CTF2
DateTime                 : 2020:08:27 09:43:15
DigitalZoomRatio         : (0, 0)
FocalLengthIn35mmFilm    : 27
Contrast                 : 0
Saturation               : 0
Sharpness                : 0
ExifOffset               : 226
MakerNote                : 0100 Z@P

How do I get the coordinate point details (latitude and longitude) from the image?


Solution

  • Using the module piexif (pip install piexif) you can get to the GPS information in the exif as follows.

    from pprint import pprint
    from PIL import Image
    import piexif
    
    codec = 'ISO-8859-1'  # or latin-1
    
    def exif_to_tag(exif_dict):
        exif_tag_dict = {}
        thumbnail = exif_dict.pop('thumbnail')
        exif_tag_dict['thumbnail'] = thumbnail.decode(codec)
    
        for ifd in exif_dict:
            exif_tag_dict[ifd] = {}
            for tag in exif_dict[ifd]:
                try:
                    element = exif_dict[ifd][tag].decode(codec)
    
                except AttributeError:
                    element = exif_dict[ifd][tag]
    
                exif_tag_dict[ifd][piexif.TAGS[ifd][tag]["name"]] = element
    
        return exif_tag_dict
    
    def main():
        filename = 'IMG_2685.jpg'  # obviously one of your own pictures
        im = Image.open(filename)
    
        exif_dict = piexif.load(im.info.get('exif'))
        exif_dict = exif_to_tag(exif_dict)
    
        pprint(exif_dict['GPS'])
    
    if __name__ == '__main__':
       main()
    

    result

    {'GPSAltitude': (94549, 14993),
     'GPSAltitudeRef': 0,
     'GPSDateStamp': '2020:09:04',
     'GPSDestBearing': (1061399, 5644),
     'GPSDestBearingRef': 'T',
     'GPSHPositioningError': (5, 1),
     'GPSImgDirection': (1061399, 5644),
     'GPSImgDirectionRef': 'T',
     'GPSLatitude': ((12, 1), (34, 1), (1816, 100)),
     'GPSLatitudeRef': 'N',
     'GPSLongitude': ((99, 1), (57, 1), (4108, 100)),
     'GPSLongitudeRef': 'E',
     'GPSSpeed': (0, 1),
     'GPSSpeedRef': 'K',
     'GPSTimeStamp': ((13, 1), (2, 1), (4599, 100)),
     'GPSVersionID': (2, 2, 0, 0)}
    

    Here exif_to_tag translates exif codes to more readable tags.