一.引言我们的朋友给我们发来一张照片我们如何获取到她的位置呢?
用手机拍照会带着gps信息,原来没注意过这个,因此查看下并使用代码获取照片里的gps信息
查看图片文件属性
1.读取照片信息,获取坐标exifread
python library to extract exif data from tiff and jpeg files.
安装
pip install exifread
读取gps
import exifreadimport redef read(): gps = {} date = '' f = open("c:\\users\\24190\\desktop\\小朱学长.jpg",'rb') contents = exifread.process_file(f) for key in contents: if key == "gps gpslongitude": print("经度 =", contents[key],contents['gps gpslatituderef']) elif key =="gps gpslatitude": print("纬度 =",contents[key],contents['gps gpslongituderef']) #print(contents)read()
运行
我们得到了一个简易的gps地址
如果想要读取全部的拍摄信息:
# 读取照片的gps经纬度信息def find_gps_image(pic_path): gps = {} date = '' with open(pic_path, 'rb') as f: tags = exifread.process_file(f) for tag, value in tags.items(): # 纬度 if re.match('gps gpslatituderef', tag): gps['gpslatituderef'] = str(value) # 经度 elif re.match('gps gpslongituderef', tag): gps['gpslongituderef'] = str(value) # 海拔 elif re.match('gps gpsaltituderef', tag): gps['gpsaltituderef'] = str(value) elif re.match('gps gpslatitude', tag): try: match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups() gps['gpslatitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2]) except: deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')] gps['gpslatitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec) elif re.match('gps gpslongitude', tag): try: match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups() gps['gpslongitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2]) except: deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')] gps['gpslongitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec) elif re.match('gps gpsaltitude', tag): gps['gpsaltitude'] = str(value) elif re.match('.*date.*', tag): date = str(value) return {'gps_information': gps, 'date_information': date}
2.通过baidu map的api将gps信息转换成地址。众所周知gps和百度的经纬度会有误差,那么我们需要调用百度转换接口,这个百度目前没有开源。
# 通过baidu map的api将gps信息转换成地址。def find_address_from_gps(gps): """ 使用geocoding api把经纬度坐标转换为结构化地址。 :param gps: :return: """ secret_k ey = 'xxx' if not gps['gps_information']: return '该照片无gps信息' lat, lng = gps['gps_information']['gpslatitude'], gps['gps_information']['gpslongitude'] baidu_map_api = "http://api.map.baidu.com/geocoder/v2/?ak={0}&callback=renderreverse&location={1},{2}s&output=json&pois=0".format( secret_key, lat, lng) response = requests.get(baidu_map_api) content = response.text.replace("renderreverse&&renderreverse(", "")[:-1] print(content) baidu_map_address = json.loads(content) formatted_address = baidu_map_address["result"]["formatted_address"] province = baidu_map_address["result"]["addresscomponent"]["province"] city = baidu_map_address["result"]["addresscomponent"]["city"] district = baidu_map_address["result"]["addresscomponent"]["district"] location = baidu_map_address["result"]["sematic_description"] return formatted_address, province, city, district, location
然后在主函数输出:
二.源码附上!!!# coding=utf-8import exifreadimport reimport jsonimport requestsimport os# 转换经纬度格式def latitude_and_longitude_convert_to_decimal_system(*arg): """ 经纬度转为小数, param arg: :return: 十进制小数 """ return float(arg[0]) + ((float(arg[1]) + (float(arg[2].split('/')[0]) / float(arg[2].split('/')[-1]) / 60)) / 60)# 读取照片的gps经纬度信息def find_gps_image(pic_path): gps = {} date = '' with open(pic_path, 'rb') as f: tags = exifread.process_file(f) for tag, value in tags.items(): # 纬度 if re.match('gps gpslatituderef', tag): gps['gpslatituderef'] = str(value) # 经度 elif re.match('gps gpslongituderef', tag): gps['gpslongituderef'] = str(value) # 海拔 elif re.match('gps gpsaltituderef', tag): gps['gpsaltituderef'] = str(value) elif re.match('gps gpslatitude', tag): try: match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups() gps['gpslatitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2]) except: deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')] gps['gpslatitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec) elif re.match('gps gpslongitude', tag): try: match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups() gps['gpslongitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2]) except: deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')] gps['gpslongitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec) elif re.match('gps gpsaltitude', tag): gps['gpsaltitude'] = str(value) elif re.match('.*date.*', tag): date = str(value) return {'gps_information': gps, 'date_information': date}# 通过baidu map的api将gps信息转换成地址。def find_address_from_gps(gps): """ 使用geocoding api把经纬度坐标转换为结构化地址。 :param gps: :return: """ secret_ke y = 'zblsuddl4cs2u0m4kezozzbguy9iwtvf' if not gps['gps_information']: return '该照片无gps信息' lat, lng = gps['gps_information']['gpslatitude'], gps['gps_information']['gpslongitude'] baidu_map_api = "http://api.map.baidu.com/geocoder/v2/?ak={0}&callback=renderreverse&location={1},{2}s&output=json&pois=0".format( secret_key, lat, lng) response = requests.get(baidu_map_api) content = response.text.replace("renderreverse&&renderreverse(", "")[:-1] print(content) baidu_map_address = json.loads(content) formatted_address = baidu_map_address["result"]["formatted_address"] province = baidu_map_address["result"]["addresscomponent"]["province"] city = baidu_map_address["result"]["addresscomponent"]["city"] district = baidu_map_address["result"]["addresscomponent"]["district"] location = baidu_map_address["result"]["sematic_description"] return formatted_address, province, city, district, locationif __name__ == '__main__': gps_info = find_gps_image(pic_path='小朱学长.jpg') address = find_address_from_gps(gps=gps_info) print("拍摄时间:" + gps_info.get("date_information")) print('照片拍摄地址:' + str(address))
注意事项1.照片的地址信息等,一般的手机相机默认是打开的。
2.微信和qq里面发送原图,信息都会完整的保留下来。
3.代码里面需要处理在照片我放到了代码的同文件夹下,所以没有写路径,大家可以自己写路径,或者放到于代码相同的路径下即可。
以上就是怎么用python获取到照片拍摄时的详细位置的详细内容。