手機拍攝的照片地理位置默認是 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")
另請參考:使用ExifTool處理文件元數據及wgs-84-gcj-02-經緯度在線轉換