怎么用Python修改一张图片的地理位置
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍"怎么用Python修改一张图片的地理位置",在日常操作中,相信很多人在怎么用Python修改一张图片的地理位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年01月31日怎么用Python修改一张图片的地理位置
这篇文章主要介绍"怎么用Python修改一张图片的地理位置",在日常操作中,相信很多人在怎么用Python修改一张图片的地理位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用Python修改一张图片的地理位置"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1.目标场景
实际上,利用 Python 是可以非常方便地修改一张图片的地理位置。
2.编写代码
在编写脚本之前,需要在虚拟环境下安装依赖库:piexif
第一步,我们读取原图的经度和纬度,然后将地理位置格式化为浮点类型。
拿到 GPS 图片坐标之后,需要转为火星坐标系数据。
def read_image(self, image_path): """ 开始处理图片 exifread:读取图片属性 :return: """ exif_dict = piexif.load(image_path) if exif_dict['GPS']: # 纬度 gps_lati_pre = exif_dict['GPS'][2] gps_lati = dms_to_gps(gps_lati_pre) # 经度 gps_long_pre = exif_dict['GPS'][4] gps_long = dms_to_gps(gps_long_pre) # GPS坐标转为高德坐标 lng, lat = wgs84togcj02(gps_long, gps_lati) print(f"原图地理位置如下\n经度:{lng}\n纬度:{lat}\n") return f'{lng}, {lat}' else: print(f'抱歉!这张图片不包含地理位置!')
第二步,利用高德 Web 服务 API 中的 逆地理编码 解析出原图的详细位置。
def get_address_by_location(self, location): """ 通过经纬度拿到地理位置 :param location: :return: """ params = { 'key': self.ak, 'location': location, 'sig': self.sign } resp = json.loads(requests.get(url=self.url_regeo, params=params).text) if resp and resp.get('regeocode') and resp.get('regeocode').get('formatted_address'): address = resp.get('regeocode').get('formatted_address') print(f'原图的拍摄地址为:{address}\n') else: print('api解析地址出错,请检查ak!\n')
第三步,寻找一个要定位的地理位置。
首先,输入目标城市和具体地址,利用高德 Web 服务 API 中的地理编码拿到要定位的地理位置。
def get_location_by_address(self, city, address): """ 通过地理位置到拿到经纬度 地理编码:https://lbs.amap.com/api/webservice/guide/api/georegeo/ :param address: :return: """ params = { 'key': self.ak, 'city': city, 'address': address, 'sig': self.sign } resp = json.loads(requests.get(url=self.url_geo, params=params).text) # 获取坐标地址 if resp and len(resp.get('geocodes')) >= 1 and resp.get('geocodes')[0].get('location'): location = resp.get('geocodes')[0].get('location') gps_data = location.split(',') # 得到经度和纬度 gps_long = float(gps_data[0]) gps_lati = float(gps_data[1]) return gps_long, gps_lati else: print('api解析地址出错,请检查ak!') return None
第四步,修改图片的地理位置。
由于 piexif 中经、纬度数据都是元组类型,因此需要将要设置的数据进行一次处理。
def gps_to_dms(gps_data): """ 坐标转为度、分、秒(double) 116.397451 http://www.gzhatu.com/du2dfm.html :param gps_data: :return:{1: b'N', 2: ((22, 1), (32, 1), (945, 100)), 3: b'E', 4: ((114, 1), (1, 1), (3445, 100)) """ # 度:向下取整 gps_degree = math.floor(gps_data) gps_data_temp1 = (gps_data - gps_degree) * 60 # 分 gps_minute = math.floor(gps_data_temp1) gps_data_temp2 = gps_data_temp1 - gps_minute # 秒,取小数点后4位 gps_second = round(gps_data_temp2 * 60, 2) # 注意:秒必须转换为整形 result = ((gps_degree, 1), (gps_minute, 1), (int(gps_second * 100), 100)) return result
最后,将正确格式的经纬度数据写入到图片中去。
def write_image(self, image_path, gps_long, gps_lati): """ 修改文件夹下所有文件的属性 :param image_path: 文件夹路径 :return: """ # 读取图片 img = Image.open(image_path) try: exif_dict = piexif.load(img.info['exif']) except: print('加载文件地理位置异常!') return # 修改地理位置 # GPS GPSLatitudeRef:N # GPS GPSLatitude:[22, 32, 189/20] # GPS GPSLongitudeRef:E # GPS GPSLongitude:[114, 1, 689/20] exif_dict['GPS'][2] = gps_to_dms(gps_lati) exif_dict['GPS'][4] = gps_to_dms(gps_long) exif_bytes = piexif.dump(exif_dict) # 写入到新的图片中去 img.save(image_path, 'jpeg', exif=exif_bytes)
到此,关于"怎么用Python修改一张图片的地理位置"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
地理
位置
地理位置
图片
坐标
地址
纬度
原图
数据
文件
经度
学习
经纬
经纬度
编码
高德
属性
文件夹
更多
格式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2个表格去重复数据库
阿里云2003添加数据库
数据放在服务器安全吗
上海威力网络技术
晨光网络技术有限公司
apex未找到服务器闪退
数据库 主键作用
产品经理负责数据库吗
阿里的数据库怎么开发
网络安全手抄报黑白画简单
软件开发在线学习
乍得企业数据库
同为服务器查不到录像
计算机网络技术封装成帧
云博计算机软件开发有限公司
syql数据库
万方数据库论文是正规吗
绝地求生国际版体验怎么改服务器
国家网络安全宣传周卡通漫画
手机服务器在那里找
js数据库教程
数据库功能区是什么
违害网络安全罪可以罚款处理吗
网络安全检测包括
掌易互联网络有限科技公司
网络安全云概念
数据库为什么要有自增id
软路由中转服务器
屏幕共享软件开发在哪儿
强化青少年网络安全