這個(gè)原圖拍攝時(shí)需要有打開(kāi)GPS定位,這樣它的位置信息就會(huì)保存到圖片中朴则。
這個(gè)方法的實(shí)現(xiàn)需要用到Python 的Exifread和GeoPy兩個(gè)包权纤。
先普及一下Exif信息钓简,它最初由日本電子工業(yè)發(fā)展協(xié)會(huì)在1996年制定,它是可以附加于JPEG汹想、TIFF外邓、RIFF等文件之中,為其增加有關(guān)數(shù)碼相機(jī)拍攝信息的內(nèi)容和索引圖或圖像處理軟件的版本信息古掏。
而我們用到的第二個(gè)GeoPy包损话,它最強(qiáng)大的功能就是將獲取到的位置信息定位到地址。
1槽唾、先讀取圖片
img_file = open(photo, 'rb')
image_map = exifread.process_file(img_file)
2丧枪、獲取圖片信息中的經(jīng)緯度信息
# 圖片的經(jīng)度
img_longitude_ref = image_map["GPS GPSLongitudeRef"].printable
img_longitude = image_map["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_longitude = float(img_longitude[0]) + float(img_longitude[1]) / 60 + float(img_longitude[2]) / float(img_longitude[3]) / 3600
if img_longitude_ref != "E":
img_longitude = img_longitude * (-1)
# 圖片的緯度
img_latitude_ref = image_map["GPS GPSLatitudeRef"].printable
img_latitude = image_map["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_latitude = float(img_latitude[0]) + float(img_latitude[1]) / 60 + float(img_latitude[2]) / float(img_latitude[3]) / 3600
if img_latitude_ref != "N":
img_latitude = img_latitude * (-1)
3、獲取圖片的拍攝時(shí)間并關(guān)閉(如果你還想獲取其他信息庞萍,你可以在關(guān)閉前拧烦,自己獲取)
img_create_date = image_map["EXIF DateTimeOriginal"].printable
img_file.close()
4钝计、把獲取到的經(jīng)緯度信息恋博,通過(guò)GeoPy包輸出顯示
reverse_value = str(lat) + ', ' + str(lon)
geolocator = Nominatim()
location = geolocator.reverse(reverse_value)
print('照片的經(jīng)緯度信息:')
print((location.latitude, location.longitude))
print('照片的地址信息:')
print(location.address)
print('照片的全部信息:')
print(location.raw)
完整代碼如下
import exifread
import json
import urllib.request
import sys
from geopy.geocoders import Nominatim
# 獲取照片的詳細(xì)信息
def get_img_infor_tup(photo):
img_file = open(photo, 'rb')
image_map = exifread.process_file(img_file)
try:
# 圖片的經(jīng)度
img_longitude_ref = image_map["GPS GPSLongitudeRef"].printable
img_longitude = image_map["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_longitude = float(img_longitude[0]) + float(img_longitude[1]) / 60 + float(img_longitude[2]) / float(img_longitude[3]) / 3600
if img_longitude_ref != "E":
img_longitude = img_longitude * (-1)
# 圖片的緯度
img_latitude_ref = image_map["GPS GPSLatitudeRef"].printable
img_latitude = image_map["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
img_latitude = float(img_latitude[0]) + float(img_latitude[1]) / 60 + float(img_latitude[2]) / float(img_latitude[3]) / 3600
if img_latitude_ref != "N":
img_latitude = img_latitude * (-1)
# 照片拍攝時(shí)間
img_create_date = image_map["EXIF DateTimeOriginal"].printable
img_file.close()
# 返回經(jīng)緯度元組
return img_longitude, img_latitude, img_create_date
except Exception as e:
print('ERROR:圖片中不包含Gps信息')
# 根據(jù)經(jīng)緯度獲取詳細(xì)的信息
def get_detail_infor(lat, lon):
reverse_value = str(lat) + ', ' + str(lon)
geolocator = Nominatim()
location = geolocator.reverse(reverse_value)
print('照片的經(jīng)緯度信息:')
print((location.latitude, location.longitude))
print('照片的地址信息:')
print(location.address)
print('照片的全部信息:')
print(location.raw)
if __name__ == '__main__':
infor_tup = get_img_infor_tup("你要檢測(cè)的照片路徑")
get_detail_infor(infor_tup[1], infor_tup[0])
好了以上就是如何通過(guò)圖片獲取位置的方法了。