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