首先,要能够查询到照片地址,查询的照片必须要开GPS拍,且上传时用原图……
查询图片的exif信息,使用exifread包
import exifread
img = exifread.process_file(open(path), 'rb')
longitude = img['GPS GPSLongitude']
latitude = img['GPS GPSLatitude']
这里建议,可以找一个exif查看器上传一个图片看一看,对GPS GPSLongitude等信息有一个直观印象
到这里,我花费时间最长才发现的一个坑。现象是我写完后,读取结果总是[],print(resp.text)发现经纬度根本没有读进去。type(longitude)才发现这是
longitude_gps = longitude.values
latitude_gps = latitude.values
下一步,我一开始也不清楚,拿到的是度分秒的经纬度,需要转化为十进制的经纬度
转换公式为 度+分/60+秒/3600,得到longitude_new, latitude_news
吸取上一步教训,longitude_gps[0],longitude_gps[1],longitude_gps[2] 分别为度,分,秒,但要用.num方法获取值
按道理,我们已经将度分秒的经纬度进行了转换,用于最后一步。
import requests
import json
url = 'https://restapi.amap.com/v3/geocode/regeo?key={}&location={}' #详见高德逆解析地理API文档
location = '{},{}'.format(longitude_new, latitude_news)
api_key = 'sdasadsadsad' #申请成为高德个人开发者。添加应用管理既可
resp = requests.get(url.format(api_key, location))
data = json.loads(resp.text)
address = data.get('regeocode').get('formatted_address')
print(address)
再回头看以上,还有两个问题是在实际测试中发现的。
1. 经纬度,高德提供小数点后6位, 因此要约一下,用round函数即可
2. longitude_gps[2] 在整数的时候没问题,但会遇到m/n的情况,这无法直接运算,会出现较大误差。更改为eval(str(latitude_gps[-1]))计算。