手機拍攝的照片地理位置默認是 WGS-84 系統,但是谷歌地圖使用的卻是 GCJ-02 系統,這就會出現偏移。爲了展示正確的位置,可以通過把照片的地理位置標籤轉換成 GCJ-02 來實現。需要用到 Phil Harvey開發的 ExifTool 和 Avatar sshuair 開發的 coord-convert。前者下載exiftool.exe 到本地即可,後者可以通過 pip 安裝。
# -*- coding: utf-8 -*- #pip install coord-convert #Usage: #Drage a single photo or directory with photos to this script # OR #python wgs2gcj.py D:\my.JPG #Results will be wrote to gps.log at the same dir with this script from coord_convert.transform import wgs2gcj import subprocess,json,sys,os,time,datetime #You may set your exiftool file here exiftool_path = "D:\\Program Files\\portable\\exiftool.exe" work_dir = os.getcwd() def log42(logFile,logText): ts = int(time.time()) dt = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') log_file = os.path.join(work_dir,logFile+".log") with open(log_file, "a") as myfile: myfile.write(dt+" "+logText+"\n") print(logText) if (exiftool_path == ""): exiftool_path = os.path.join(work_dir,'exiftool.exe') if not os.path.exists(exiftool_path): log42("gps","Error: exiftool.exe not found neither in script directory nor in the script setting \"exiftool_path\"") exit() file_paths_input = sys.argv[1:] file_paths = [] for file_path_input in file_paths_input: if os.path.isfile(file_path_input): file_paths.append(file_path_input) elif os.path.isdir(file_path_input): for root,ds,fs in os.walk(file_path_input): for ff in fs: full_path = os.path.join(root,ff) file_paths.append(full_path) for f in file_paths: output = subprocess.check_output('"'+exiftool_path+'" -struct -j -a -n "-gps*" '+f, shell=True) data = json.loads(output) if 'GPSMapDatum' in data[0]: log42("gps",data[0]['SourceFile']+':'+str(data[0]['GPSMapDatum'])+' '+str(data[0]['GPSLatitude'])+' '+str(data[0]['GPSLongitude'])) if(data[0]['GPSMapDatum']=='WGS-84'): gcj_lon, gcj_lat = wgs2gcj(data[0]['GPSLongitude'], data[0]['GPSLatitude']) log42("gps",str(gcj_lat)+' '+str(gcj_lon)) if (gcj_lat==data[0]['GPSLatitude']): log42("gps",'not in China') else: output = subprocess.check_output('"'+exiftool_path+'" -overwrite_original -exif:gpsmapdatum=GCJ-02 -exif:gpslatitude='+str(gcj_lat)+' -exif:gpslongitude='+str(gcj_lon)+' '+f, shell=True) log42("gps",output.decode()) else: log42("gps","not a wgs84 location") else: log42("gps","no gps data found") log42("gps","task finished")