赞同 6
分享
刷新

照片原图获取 经纬度 和 逆地理编码(现实地址)

简介:通过照片原图获取 经纬度 和逆地理编码(现实地址)
  2020.05.06
  Bug Man
  6
  140
  172.17.0.1
  中国.上海
 
 

  • 重要前提:拍摄手机是android&开启GPS。
  • 原理:在手机拍摄照片的时候会默认获取GPS信息,以及一些设备信息和图像信息。这里获取地址会使用到高德地图的逆地理编码接口,发送接口请求会使用到key(这个需要通过个人开发者去获取),这里查看获取key的获取方式高德开发文档

少废话,看效果!

运行结果

  • 讲解一下:这有什么用呢?好像也没啥用啊,但是如果你放在你的网站里提供娱乐也是不错的。

少废话,直接上代码!

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  # 经度
        self.lg_float = None  # 经度小数
        self.latitude = None  # 纬度
        self.lt_float = None  # 纬度小数

    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("经度 =", self.longitude, contents['GPS GPSLatitudeRef'])
                    print("经度小数 =", 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("纬度小数 =", 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):
        """
        拼接计算经纬度
        @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):
        """
        将经纬度转化为小数
        @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):
        """
        请求高德逆地理编码
        @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('没有响应!')


if __name__ == '__main__':
    s = Search()
    s.get_gps_by_photo("D:/GPS_position.jpg")