python+exifread+百度地图api:获取图片信息及地理位置

目录

exifread获取图片信息

百度地图接口获取地址信息


exifread获取图片信息

获取图片信息可以使用exifread库,第三方库需要安装。

要注意的是必须是携带 Exif 信息的原始图片才能解析。如果中间进行了压缩、或者P图等操作,则无法识别。如微信等一些社交平台会专门针对 Exif 进行处理,所以是不会暴露位置信息。
Exif是指可交换图像文件格式的缩写,它是一种为数字照片存储和传输附加元数据的标准格式。Exif包含了拍摄设备、拍摄日期、曝光时间、焦距、经纬度等多种信息。

使用exifread.process_file(f)方法读取图片数据,其中的参数为通过文件读取方式读取到图片的二进制数据流。

def get_img_data(file_path):
    with open(file_path, 'rb') as f:  # 只能使用rb二进制读写,使用w写入后,图标将被修改成无法被识别的文件,会使得图标被破坏
        img_data = exifread.process_file(f)

    data_keys = list(img_data.keys())

    if 'GPS GPSLatitude' in data_keys and 'GPS GPSLongitude' in data_keys:  # 判断目标数据是否存在,这里需要的是经纬度数据
        GPSLatitude, GPSLongitude = img_data['GPS GPSLatitude'], img_data['GPS GPSLongitude']

        # GPSLatitude, GPSLatitudeRef = img_data['GPS GPSLatitude'], img_data['GPS GPSLatitudeRef']  # 纬度
        # GPSLongitude, GPSLongitudeRef = img_data['GPS GPSLongitude'], img_data['GPS GPSLongitudeRef']  # 经度
        # ImageWidth, ImageLength = img_data['Image ImageWidth'], img_data['Image ImageLength']  # 图片大小
        # ImageMake, ImageModel = img_data['Image Make'], img_data['Image Model']  # 设备平台及型号
        # DateTime = img_data['Image DateTime']  # 拍摄图片时间

        # 获取经纬度数据并转换成可读数据,需要根据度分秒转换【这里得到的经纬度永远是正数,如果是西经,那么得到的经度要乘上 -1;同理如果是南纬,那么纬度要乘上 -1】
        gps_lat, gps_long = GPSLatitude.values, GPSLongitude.values
        lat = float(gps_lat[0]) + float(gps_lat[1] / 60) + float(str(gps_lat[2]).split('/')[0]) / float(
            str(gps_lat[2]).split('/')[1]) / 3600
        long = float(gps_long[0]) + float(gps_long[1] / 60) + float(str(gps_long[2]).split('/')[0]) / float(
            str(gps_long[2]).split('/')[1]) / 3600
        return long, lat
    else:
        print('图片不存在经纬度信息')
        return None

通过打印 img_data = exifread.process_file(f) 可以获取图片很多信息,如下所示:

百度地图接口获取地址信息

百度api接口AK申请登录百度账号

import exifread, requests, urllib, hashlib

def get_addr(ak, sk, long, lat):
    host = "https://api.map.baidu.com"  # 服务地址
    uri = "/reverse_geocoding/v3"  # 接口地址

    params = {
        "ak": ak,
        "output": "json",
        "coordtype": "wgs84ll",
        "extensions_poi": "0",
        "location": f"{lat},{long}",
    }  # 设置您的请求参数

    # 拼接请求字符串
    paramsArr = []
    for key in params:
        paramsArr.append(key + "=" + params[key])

    queryStr = uri + "?" + "&".join(paramsArr)

    encodedStr = urllib.request.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")  # 对queryStr进行转码,safe内的保留字符不转换

    rawStr = encodedStr + sk  # 在最后直接追加上您的SK

    sn = hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()  # 计算sn

    queryStr = queryStr + "&sn=" + sn  # 将sn参数添加到请求中

    # 请注意,此处打印的url为非urlencode后的请求串
    # 如果将该请求串直接粘贴到浏览器中发起请求,由于浏览器会自动进行urlencode,会导致返回sn校验失败
    url = host + queryStr
    response = requests.get(url)
    if response:
        # print(response.json())
        print(response.json()['result']['formatted_address'])
if __name__ == '__main__':
    ak = "your_ak"  # 此处填写你在控制台-应用管理-创建应用后获取的AK
    sk = "your_sk"  # 此处填写你在控制台-应用管理-创建应用时,校验方式选择sn校验后生成的SK
    file_path = r'C:\Users\Administrator\Desktop\testfile\IMG_20240609_191135.jpg'
    img_data = get_img_data(file_path)
    if not img_data:
        ...
    else:
        long, lat = img_data
        if long and lat:
            get_addr(ak, sk, long, lat)

相关推荐

  1. 地图瓦片下载地址

    2024-07-15 22:52:04       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 22:52:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 22:52:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 22:52:04       62 阅读
  4. Python语言-面向对象

    2024-07-15 22:52:04       72 阅读

热门阅读

  1. Linux高级IO流详解

    2024-07-15 22:52:04       21 阅读
  2. 10个使用Numba CUDA进行编程的例子

    2024-07-15 22:52:04       18 阅读
  3. OSINT技术情报精选·2024年7月第2周

    2024-07-15 22:52:04       16 阅读
  4. 第一个AI应用(文心智能体平台)

    2024-07-15 22:52:04       16 阅读
  5. pytorch学习--使用m1 进行训练

    2024-07-15 22:52:04       18 阅读
  6. Halcon与C++之间的数据转换

    2024-07-15 22:52:04       19 阅读
  7. QT 报错C2872: “byte“: 不明确的符号

    2024-07-15 22:52:04       19 阅读
  8. 【linux 100条命令】

    2024-07-15 22:52:04       19 阅读
  9. setContentView 流程

    2024-07-15 22:52:04       24 阅读
  10. HTTP——GET请求

    2024-07-15 22:52:04       23 阅读
  11. linux系统php开机自启动 phpfpm

    2024-07-15 22:52:04       19 阅读