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