Python實現獲取照片的地理定位信息
一、步驟
要從 JPEG 圖像中獲取經緯度信息,可以使用 Python 的 PIL(Python Imaging Library)庫。以下是一個示例代碼,用於從 JPEG 圖像中獲取經緯度信息並打印出來:
二、源代碼
from PIL import Image from PIL.ExifTags import TAGS, GPSTAGS def get_exif_data(image_path): """ 獲取 JPEG 圖像的 EXIF 數據 """ exif_data = {} with Image.open(image_path) as img: if hasattr(img, '_getexif'): # 獲取所有 EXIF 標簽 for tag, value in img._getexif().items(): if tag in TAGS: exif_data[TAGS[tag]] = value # 獲取 GPSInfo 標簽 if 'GPSInfo' in exif_data: # 解析 GPSInfo 標簽中的子標簽 gps_data = {} for gps_tag in exif_data['GPSInfo'].keys(): tag_name = GPSTAGS.get(gps_tag, gps_tag) gps_data[tag_name] = exif_data['GPSInfo'][gps_tag] exif_data['GPSInfo'] = gps_data return exif_data def get_gps_info(exif_data): """ 從 EXIF 數據中提取經緯度信息 """ gps_info = {} if 'GPSInfo' in exif_data: # 獲取經度 lat = exif_data['GPSInfo']['GPSLatitude'] lat_ref = exif_data['GPSInfo']['GPSLatitudeRef'] # lat_degrees = lat[0][0] / float(lat[0][1]) lat_degrees = lat[0].numerator / float(lat[0].denominator) # lat_minutes = lat[1][0] / float(lat[1][1]) lat_minutes = lat[1].numerator / float(lat[1].denominator) # lat_seconds = lat[2][0] / float(lat[2][1]) lat_seconds = lat[2].numerator / float(lat[2].denominator) lat_direction = lat_ref gps_info['latitude'] = (lat_degrees + (lat_minutes / 60.0) + (lat_seconds / 3600.0)) * (-1 if lat_direction == 'S' else 1) # 獲取緯度 lon = exif_data['GPSInfo']['GPSLongitude'] lon_ref = exif_data['GPSInfo']['GPSLongitudeRef'] # lon_degrees = lon[0][0] / float(lon[0][1]) lon_degrees = lon[0].numerator / float(lon[0].denominator) # lon_minutes = lon[1][0] / float(lon[1][1]) lon_minutes = lon[1].numerator / float(lon[1].denominator) # lon_seconds = lon[2][0] / float(lon[2][1]) lon_seconds = lon[2].numerator / float(lon[2].denominator) lon_direction = lon_ref gps_info['longitude'] = (lon_degrees + (lon_minutes / 60.0) + (lon_seconds / 3600.0)) * (-1 if lon_direction == 'W' else 1) return gps_info # 測試代碼 if __name__ == '__main__': image_path = r'D:\spiderdocs\FtpServer\IMG_20230302_134126.jpg' # 修改為你自己的 JPEG 圖像路徑 exif_data = get_exif_data(image_path) gps_info = get_gps_info(exif_data) print('經度:', gps_info['longitude']) print('緯度:', gps_info['latitude'])
三、代碼說明
在上述代碼中,我們使用瞭 if hasattr(img, '_getexif'): 來檢查圖片是否包含 EXIF 數據。如果包含,就將獲取到的 EXIF 數據保存在 exif_data 變量中。然後再使用 if exif_data is None: 來檢查 exif_data 是否為 None。如果是,就說明圖片沒有 EXIF 數據,打印一條消息並返回一個空字典。否則,將 EXIF 數據轉換為字典格式並返回。
四、報錯1
Traceback (most recent call last):
File "d:\spiderdocs\jpegexifgps.py", line 53, in <module>
exif_data = get_exif_data(image_path)
File "d:\spiderdocs\jpegexifgps.py", line 12, in get_exif_data
for tag, value in img._getexif().items():
AttributeError: 'NoneType' object has no attribute 'items'
五、解決方法1
出現這種情況的原因可能是文件中沒有 EXIF 數據或者圖片格式不支持 EXIF 數據。為瞭避免出現這種錯誤,您可以在調用 _getexif() 方法之前,先檢查一下是否存在 _getexif() 方法和返回的 EXIF 數據是否為 None。如果是 None,則說明該圖片沒有 EXIF 數據,需要相應地處理。
1.打開手機的相機應用,進入相機設置。
2.找到 “地理標記” 或者 “位置信息” 這個選項,打開它。
3.確保允許相機應用訪問位置信息。在有些手機上,您需要在設置中打開相機應用的位置權限。
4.如果您希望在每次拍照時都保存經緯度信息,可以選擇“始終使用”或“啟用”選項。如果您隻想在需要時保存位置信息,可以選擇“詢問每次”選項。
5.拍攝照片時,手機會自動獲取當前位置的經緯度信息,並將其保存在照片的 EXIF 數據中。您可以使用一些工具或軟件來讀取照片的 EXIF 數據,並提取經緯度信息。
請註意,啟用位置信息會對手機的電池壽命產生一定影響。如果您不需要在拍照時保存經緯度信息,建議關閉位置信息功能,以延長手機的電池壽命。
六、報錯2
Traceback (most recent call last):
File "d:\spiderdocs\jpegexifgps.py", line 57, in <module>
gps_info = get_gps_info(exif_data)
File "d:\spiderdocs\jpegexifgps.py", line 34, in get_gps_info
lat_degrees = lat[0][0] / float(lat[0][1])
TypeError: 'IFDRational' object is not subscriptable
七、解決方法2
這個錯誤是因為在讀取經緯度信息時,使用瞭 IFDRational 類型的對象來進行下標操作,而 IFDRational 類型並不支持下標操作。
建議檢查代碼中讀取經緯度信息的部分,並確保使用正確的數據類型進行操作。您可以嘗試使用 numerator 和 denominator 屬性來獲取 IFDRational 類型對象的值,例如:
類似地,您也可以使用 longitude[0].numerator 和 longitude[0].denominator 來獲取經度的度數。
lat_degrees = lat[0].numerator / float(lat[0].denominator)
八、效果如下所示
九、驗證效果如下
1)打開:拾取坐標系統
2)輸入框中輸入:坐標(如:120.39987897666663,30.128810976666666)
註意:勾選“坐標反查”。
到此這篇關於Python實現獲取照片的地理定位信息的文章就介紹到這瞭,更多相關Python獲取照片地理定位信息內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++重載運算符實現分數加減乘除
- python heic後綴圖片文件轉換成jpg格式的操作
- Python數據獲取實現圖片數據提取
- Python基於mediainfo批量重命名圖片文件
- C++ 轉換函數用法案例詳解