Python實(shí)現(xiàn)獲取照片的地理定位信息
一、步驟
要從 JPEG 圖像中獲取經(jīng)緯度信息,可以使用 Python 的 PIL(Python Imaging Library)庫(kù)。以下是一個(gè)示例代碼,用于從 JPEG 圖像中獲取經(jīng)緯度信息并打印出來(lái):
二、源代碼
from PIL import Image from PIL.ExifTags import TAGS, GPSTAGS def get_exif_data(image_path): """ 獲取 JPEG 圖像的 EXIF 數(shù)據(jù) """ exif_data = {} with Image.open(image_path) as img: if hasattr(img, '_getexif'): # 獲取所有 EXIF 標(biāo)簽 for tag, value in img._getexif().items(): if tag in TAGS: exif_data[TAGS[tag]] = value # 獲取 GPSInfo 標(biāo)簽 if 'GPSInfo' in exif_data: # 解析 GPSInfo 標(biāo)簽中的子標(biāo)簽 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 數(shù)據(jù)中提取經(jīng)緯度信息 """ gps_info = {} if 'GPSInfo' in exif_data: # 獲取經(jīng)度 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 # 測(cè)試代碼 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('經(jīng)度:', gps_info['longitude']) print('緯度:', gps_info['latitude'])
三、代碼說(shuō)明
在上述代碼中,我們使用了 if hasattr(img, '_getexif'): 來(lái)檢查圖片是否包含 EXIF 數(shù)據(jù)。如果包含,就將獲取到的 EXIF 數(shù)據(jù)保存在 exif_data 變量中。然后再使用 if exif_data is None: 來(lái)檢查 exif_data 是否為 None。如果是,就說(shuō)明圖片沒(méi)有 EXIF 數(shù)據(jù),打印一條消息并返回一個(gè)空字典。否則,將 EXIF 數(shù)據(jù)轉(zhuǎn)換為字典格式并返回。
四、報(bào)錯(cuò)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
出現(xiàn)這種情況的原因可能是文件中沒(méi)有 EXIF 數(shù)據(jù)或者圖片格式不支持 EXIF 數(shù)據(jù)。為了避免出現(xiàn)這種錯(cuò)誤,您可以在調(diào)用 _getexif() 方法之前,先檢查一下是否存在 _getexif() 方法和返回的 EXIF 數(shù)據(jù)是否為 None。如果是 None,則說(shuō)明該圖片沒(méi)有 EXIF 數(shù)據(jù),需要相應(yīng)地處理。
1.打開(kāi)手機(jī)的相機(jī)應(yīng)用,進(jìn)入相機(jī)設(shè)置。
2.找到 “地理標(biāo)記” 或者 “位置信息” 這個(gè)選項(xiàng),打開(kāi)它。
3.確保允許相機(jī)應(yīng)用訪問(wèn)位置信息。在有些手機(jī)上,您需要在設(shè)置中打開(kāi)相機(jī)應(yīng)用的位置權(quán)限。
4.如果您希望在每次拍照時(shí)都保存經(jīng)緯度信息,可以選擇“始終使用”或“啟用”選項(xiàng)。如果您只想在需要時(shí)保存位置信息,可以選擇“詢問(wèn)每次”選項(xiàng)。
5.拍攝照片時(shí),手機(jī)會(huì)自動(dòng)獲取當(dāng)前位置的經(jīng)緯度信息,并將其保存在照片的 EXIF 數(shù)據(jù)中。您可以使用一些工具或軟件來(lái)讀取照片的 EXIF 數(shù)據(jù),并提取經(jīng)緯度信息。
請(qǐng)注意,啟用位置信息會(huì)對(duì)手機(jī)的電池壽命產(chǎn)生一定影響。如果您不需要在拍照時(shí)保存經(jīng)緯度信息,建議關(guān)閉位置信息功能,以延長(zhǎng)手機(jī)的電池壽命。
六、報(bào)錯(cuò)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
這個(gè)錯(cuò)誤是因?yàn)樵谧x取經(jīng)緯度信息時(shí),使用了 IFDRational 類型的對(duì)象來(lái)進(jìn)行下標(biāo)操作,而 IFDRational 類型并不支持下標(biāo)操作。
建議檢查代碼中讀取經(jīng)緯度信息的部分,并確保使用正確的數(shù)據(jù)類型進(jìn)行操作。您可以嘗試使用 numerator 和 denominator 屬性來(lái)獲取 IFDRational 類型對(duì)象的值,例如:
類似地,您也可以使用 longitude[0].numerator 和 longitude[0].denominator 來(lái)獲取經(jīng)度的度數(shù)。
lat_degrees = lat[0].numerator / float(lat[0].denominator)
八、效果如下所示
九、驗(yàn)證效果如下
1)打開(kāi):拾取坐標(biāo)系統(tǒng)
2)輸入框中輸入:坐標(biāo)(如:120.39987897666663,30.128810976666666)
注意:勾選“坐標(biāo)反查”。
到此這篇關(guān)于Python實(shí)現(xiàn)獲取照片的地理定位信息的文章就介紹到這了,更多相關(guān)Python獲取照片地理定位信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基礎(chǔ)語(yǔ)法(Python基礎(chǔ)知識(shí)點(diǎn))
這篇文章主要介紹了Python基礎(chǔ)語(yǔ)法(Python基礎(chǔ)知識(shí)點(diǎn)),需要的朋友可以參考下2016-02-02解決Jupyter因卸載重裝導(dǎo)致的問(wèn)題修復(fù)
這篇文章主要介紹了解決Jupyter因卸載重裝導(dǎo)致的問(wèn)題修復(fù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04pytorch fine-tune 預(yù)訓(xùn)練的模型操作
這篇文章主要介紹了pytorch fine-tune 預(yù)訓(xùn)練的模型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法
這篇文章主要介紹了Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法,實(shí)例分析了Python腳本運(yùn)行的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04Python計(jì)算當(dāng)前日期是一年中的第幾天的方法詳解
在Python中,計(jì)算當(dāng)前日期是一年中的第幾天可以通過(guò)內(nèi)置的datetime模塊來(lái)實(shí)現(xiàn),本文將詳細(xì)介紹如何使用Python編寫代碼來(lái)完成這個(gè)任務(wù),需要的可以參考下2023-12-12Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)例
這篇文章主要為大家介紹了Python協(xié)程異步爬取數(shù)據(jù)(asyncio+aiohttp)實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08django項(xiàng)目登錄中使用圖片驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了django項(xiàng)目登錄中使用圖片驗(yàn)證碼的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08如何將自己的python庫(kù)打包成wheel文件并上傳到pypi
這篇文章主要介紹了如何將自己的python庫(kù)打包成wheel文件并上傳到pypi,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04