Generate GPS map from jpg using Python

The ExifTags module exposes several enum.IntEnum classes which provide constants and clear-text names for various well-known EXIF tags.

Use the folium ibrary to create a map and add a marker at the extracted coordinates


from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif_data(image):
    exif_data = {}
    info = image._getexif()
    if info:
        for tag, value in info.items():
            tag_name = TAGS.get(tag, tag)
            exif_data[tag_name] = value
            if tag_name == "GPSInfo":
                gps_data = {}
                for t in value:
                    sub_tag = GPSTAGS.get(t, t)
                    gps_data[sub_tag] = value[t]
                exif_data["GPSInfo"] = gps_data
    return exif_data

def get_lat_lon(exif_data):
    if "GPSInfo" in exif_data:
        gps_info = exif_data["GPSInfo"]
        
        print(gps_info)
        
        gps_latitude = gps_info.get("GPSLatitude")
        gps_latitude_ref = gps_info.get("GPSLatitudeRef")
        gps_longitude = gps_info.get("GPSLongitude")
        gps_longitude_ref = gps_info.get("GPSLongitudeRef")

        if gps_latitude and gps_latitude_ref and gps_longitude and gps_longitude_ref:
            lat = convert_to_decimal_degrees(gps_latitude)
            if gps_latitude_ref != "N":
                lat = -lat
            lon = convert_to_decimal_degrees(gps_longitude)
            if gps_longitude_ref != "E":
                lon = -lon
            return lat, lon
    return None, None

def convert_to_decimal_degrees(gps_tuple):
    degrees, minutes, seconds = gps_tuple
    decimal_degrees = degrees + (minutes / 60.0) + (seconds / 3600.0)
    return decimal_degrees

import folium

# Use the folium ibrary to create a map and add a marker at the extracted coordinates
def create_a_map(lat, lon):
    # Create a map centered around the extracted coordinates
    map = folium.Map(location=[lat, lon], zoom_start=17)

    # Add a marker at the location
    folium.Marker([lat, lon], popup='Image Location').add_to(map)

    # Save the map to an HTML file
    map.save('map.htm')
    

image_path = "source.jpg"
image = Image.open(image_path)
exif_data = get_exif_data(image)
lat, lon = get_lat_lon(exif_data)

if lat and lon:
    print(f"Latitude: {lat}, Longitude: {lon}")
    create_a_map(lat, lon)
else:
    print("No GPS data found.")