Python获取照片位置信息定位并根据省市分类

环境

此处照片读取信息为WGS84坐标,但与BD09坐标相差不大,故未做坐标转换

python3

代码

import os
import exifread
import requests
import shutil
import logging

''' 获取图像的经纬度,弧度为单位 输入参数: image_path:图像路径 返回参数: (longtitude,latitude):经纬度元组 '''
def getImageLocation(image_path):
    longtitude,latitude=-1,-181

    with open(image_path,'rb') as image_read:
        tags = exifread.process_file(image_read)
        LON_FIELD,LAT_FIELD='GPS GPSLongitude','GPS GPSLatitude'

        if LON_FIELD in tags.keys():
            lon_val=tags[LON_FIELD].values
            longtitude=float(lon_val[0].num)+float(lon_val[1].num)/60+eval(str(lon_val[2]))/3600

        if LAT_FIELD in tags.keys():
            lat_val=tags[LAT_FIELD].values
            latitude=float(lat_val[0].num)+float(lat_val[1].num)/60+eval(str(lat_val[2]))/3600

    return longtitude,latitude

''' 根据经纬度判断当前所在城市 输入参数: longitude:经度 latitude:经度 输出参数: province_name,city_name,district_name:当前经纬度所处省市区 '''
def getProvinceCityFromLocation(longitude,latitude):
    baidu_ak='百度地图AK'
    api_url='http://api.map.baidu.com/geocoder?location={},{}&output=json&key={}'.format(latitude,longitude,baidu_ak)

    response=eval(requests.get(api_url).text)

    status=response['status']

    if status=='OK':
        province_name=response['result']['addressComponent']['province']
        city_name=response['result']['addressComponent']['city']
        district_name=response['result']['addressComponent']['district']

        return province_name,city_name,district_name
    
    return None

''' 读取照片判断当前所在城市 输入参数: longitude:经度 latitude:经度 输出参数: province_name,city_name,district_name:当前经纬度所处省市 '''
def getProvinceCityFromImage(image_path):
    is_correct_lon_lat=lambda lon,lat: True if 0<=lon<=180 and -90<=lat<=90 else False 

    lon,lat=getImageLocation(image_path)
    if is_correct_lon_lat(lon,lat):
        return getProvinceCityFromLocation(lon,lat)

    return None

if __name__=='__main__':
    image_dir_path=r"照片文件夹"
    filters=['jpg','jpeg','png','bmp','tiff']
    dist_dir=os.path.join(os.path.dirname(image_dir_path),'dist')

    for image_name in os.listdir(image_dir_path):
        image_path=os.path.join(image_dir_path,image_name)

        if not os.path.exists(dist_dir):
            os.makedirs(dist_dir)

        if not os.path.isfile(image_path):
            continue

        if image_name.split('.')[-1] not in filters:
            continue

        try:
            province_name,city_name,district_name=getProvinceCityFromImage(image_path)

            dist_image_dir=os.path.join(dist_dir,province_name,city_name)

            if not os.path.exists(dist_image_dir):
                os.makedirs(dist_image_dir)

            shutil.move(image_path,dist_image_dir)
            logging.info('正在将文件'+image_path+'移动至'+dist_image_dir)
        except Exception as identifier:
            shutil.move(image_path,dist_dir)
            logging.info('未找到城市信息,正在将文件'+image_path+'移动至'+dist_image_dir)
            continue

    logging.info('分类完成!')

效果

《Python获取照片位置信息定位并根据省市分类》《Python获取照片位置信息定位并根据省市分类》

    原文作者:Angryshark_128
    原文地址: https://blog.csdn.net/weixin_42078760/article/details/103937945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞