parent
b8eb3c8fce
commit
93670142fb
@ -0,0 +1,76 @@ |
||||
from PIL import Image |
||||
from PIL.ExifTags import TAGS, GPSTAGS |
||||
import os |
||||
|
||||
def get_exif_data(image_path): |
||||
"""Get EXIF data from image file""" |
||||
try: |
||||
with Image.open(image_path) as img: |
||||
exif_data = img._getexif() |
||||
if exif_data is not None: |
||||
return {TAGS.get(tag, tag): value for tag, value in exif_data.items()} |
||||
except (AttributeError, IOError, KeyError, IndexError) as e: |
||||
print(f"Error reading EXIF data: {e}") |
||||
return None |
||||
|
||||
def get_gps_info(exif_data): |
||||
"""Extract GPS information from EXIF data""" |
||||
if not exif_data or 'GPSInfo' not in exif_data: |
||||
return None |
||||
|
||||
gps_info = {} |
||||
for key in exif_data['GPSInfo'].keys(): |
||||
decode = GPSTAGS.get(key, key) |
||||
gps_info[decode] = exif_data['GPSInfo'][key] |
||||
|
||||
return gps_info |
||||
|
||||
def convert_to_degrees(value): |
||||
"""Convert GPS coordinates stored in EXIF to degrees in decimal format""" |
||||
d, m, s = value |
||||
return d + (m / 60.0) + (s / 3600.0) |
||||
|
||||
def get_lat_lon(gps_info): |
||||
"""Get latitude and longitude from GPSInfo dictionary""" |
||||
if not gps_info: |
||||
return None, None |
||||
|
||||
try: |
||||
lat_ref = gps_info.get('GPSLatitudeRef', 'N') |
||||
lat = gps_info.get('GPSLatitude') |
||||
lon_ref = gps_info.get('GPSLongitudeRef', 'E') |
||||
lon = gps_info.get('GPSLongitude') |
||||
|
||||
if lat and lon: |
||||
lat_degrees = convert_to_degrees(lat) |
||||
if lat_ref == 'S': |
||||
lat_degrees = -lat_degrees |
||||
|
||||
lon_degrees = convert_to_degrees(lon) |
||||
if lon_ref == 'W': |
||||
lon_degrees = -lon_degrees |
||||
|
||||
return lat_degrees, lon_degrees |
||||
except (TypeError, AttributeError) as e: |
||||
print(f"Error converting coordinates: {e}") |
||||
|
||||
return None, None |
||||
|
||||
def get_coordinates_from_image(image_path): |
||||
"""Main function to get coordinates from image file""" |
||||
exif_data = get_exif_data(image_path) |
||||
if not exif_data: |
||||
print("No EXIF data found in image.") |
||||
return None |
||||
|
||||
gps_info = get_gps_info(exif_data) |
||||
if not gps_info: |
||||
print("No GPS information found in EXIF data.") |
||||
return None |
||||
|
||||
latitude, longitude = get_lat_lon(gps_info) |
||||
if latitude is not None and longitude is not None: |
||||
return (latitude, longitude) |
||||
else: |
||||
print("Could not extract valid coordinates.") |
||||
return None |
||||
Loading…
Reference in new issue