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