-3

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?

wovano
  • 4,543
  • 5
  • 22
  • 49
srini
  • 1
  • 1
  • 4
  • Does this answer your question? [In Python, how do I read the exif data for an image?](https://stackoverflow.com/questions/4764932/in-python-how-do-i-read-the-exif-data-for-an-image) – buran Sep 29 '20 at 06:11
  • I have tried the same getting information about other details except lat and long coordinates – srini Sep 29 '20 at 06:21
  • Does the image has geolocation info? – buran Sep 29 '20 at 06:33
  • 1
    In general: before posting your code-snippet describe the problem you are having. Use the code to show what you already tried. In that way people are not left guessing to what help you are asking for. – Nemelis Sep 29 '20 at 06:36
  • If there is GPS information it should be there under the tag `GPSInfo`, which gives a dict with Northing, Easting, etc. Using the answer below gives more human readable tags for the GPSInfo. – Bruno Vermeulen Sep 29 '20 at 06:49

2 Answers2

3

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.

Bruno Vermeulen
  • 2,970
  • 2
  • 15
  • 29
1

Using this module you can get the information.

pip install exif

Use this code then!

from exif import Image

def decimal_coords(coords, ref):
    decimal_degrees = coords[0] + coords[1] / 60 + coords[2] / 3600
    if ref == "S" or ref =='W' :
        decimal_degrees = -decimal_degrees
    return decimal_degrees

def image_coordinates(image_path):

    with open(image_path, 'rb') as src:
        img = Image(src)
    if img.has_exif:
        try:
            img.gps_longitude
            coords = (decimal_coords(img.gps_latitude,
                      img.gps_latitude_ref),
                      decimal_coords(img.gps_longitude,
                      img.gps_longitude_ref))
        except AttributeError:
            print ('No Coordinates')
    else:
        print ('The Image has no EXIF information')
        
    return({"imageTakenTime":img.datetime_original, "geolocation_lat":coords[0],"geolocation_lng":coords[1]})

image_coordinates('Your image path')

result

{'imageTakenTime': '2012:04:22 16:51:08',
 'geolocation_lat': 52.314166666666665,
 'geolocation_lng': 4.941}

gamingflexer
  • 250
  • 3
  • 5