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

815 阅读1分钟

环境

此处照片读取信息为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('分类完成!')

效果

在这里插入图片描述在这里插入图片描述