通過(guò)照片原圖獲取 經(jīng)緯度 和逆地理編碼(現(xiàn)實(shí)地址)
重要前提
:拍攝手機(jī)是android&開(kāi)啟GPS。
原理
:在手機(jī)拍攝照片的時(shí)候會(huì)默認(rèn)獲取GPS信息停士,以及一些設(shè)備信息和圖像信息挖帘。這里獲取地址會(huì)使用到高德地圖的逆地理編碼接口,發(fā)送接口請(qǐng)求會(huì)使用到key(這個(gè)需要通過(guò)個(gè)人開(kāi)發(fā)者去獲认虼伞)肠套,這里查看獲取key的獲取方式,高德開(kāi)發(fā)文檔猖任。
少?gòu)U話你稚,看效果!
講解一下
:這有什么用呢朱躺?好像也沒(méi)啥用啊刁赖,但是如果你放在你的網(wǎng)站里提供娛樂(lè)也是不錯(cuò)的。
少?gòu)U話长搀,直接上代碼宇弛!
import json
import exifread
import requests
class Search:
def __init__(self):
self.url = """http://restapi.amap.com/v3/geocode/regeo?key={key}
&location={longitude},{latitude}&poitype=&radius=&xtensions=&batch=false&roadlevel=0"""
self.key = '' # 需要去高德獲取
self.headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/79.0.3945.88 Safari/537.36",
}
self.longitude = None # 經(jīng)度
self.lg_float = None # 經(jīng)度小數(shù)
self.latitude = None # 緯度
self.lt_float = None # 緯度小數(shù)
def get_gps_by_photo(self, ptah):
"""
讀取照片中 GPS 信息
:param ptah: 獲取照片的本地路徑
:return:
"""
with open(ptah, 'rb') as f:
contents = exifread.process_file(f)
for key in contents:
if key == "GPS GPSLongitude":
self.longitude = self.create_string(contents[key].values)
self.lg_float = self.transform_float(contents[key].values, contents['GPS GPSLatitudeRef'])
# print("經(jīng)度 =", self.longitude, contents['GPS GPSLatitudeRef'])
print("經(jīng)度小數(shù) =", self.lg_float)
elif key == "GPS GPSLatitude":
self.latitude = self.create_string(contents[key].values)
self.lt_float = self.transform_float(contents[key].values, contents['GPS GPSLatitudeRef'])
# print("緯度 =", self.latitude, contents['GPS GPSLongitudeRef'])
print("緯度小數(shù) =", self.lt_float)
# if self.longitude is not None or self.latitude is not None:
# print('+' + self.latitude + ',' + '+' + self.longitude)
self.get_address(self.lg_float, self.lt_float)
def create_string(self, content):
"""
拼接計(jì)算經(jīng)緯度
:param content:
:return: /d°/d′/d″
"""
one = str(content[0]) + '°'
two = str(content[1]) + '′'
three = str(float(str(content[2]).split('/')[0]) / float(str(content[2]).split('/')[1])) + '″'
return one + two + three
def transform_float(self, content, direction):
"""
將經(jīng)緯度轉(zhuǎn)化為小數(shù)
:param content:
:return: float
"""
first = content[0].num
middle = content[1].num / 60
last = (float(str(content[2]).split('/')[0]) / float(str(content[2]).split('/')[1]) / 3600)
return (first + middle + last) * (-1 if direction in ('W', 'S') else 1)
def get_address(self, longitude, latitude):
"""
請(qǐng)求高德逆地理編碼
:param longitude:
:param latitude:
:return:
"""
response = requests.get(url=self.url.format(key=self.key,
longitude=longitude,
latitude=latitude), headers=self.headers)
if response.content:
result = json.loads(response.text)
print('地址:{address}'.format(address=result['regeocode']['formatted_address']))
else:
print('沒(méi)有響應(yīng)!')
if __name__ == '__main__':
s = Search()
s.get_gps_by_photo("D:/GPS_position.jpg")
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者