Google Takeout 照片没有位置信息?把 GPS 写回去
Google Takeout 导出里位置数据在哪,geoData 和 geoDataExif 是什么意思,为什么很多是 0.0,以及怎样把真实 GPS 写回照片。
在 Google 相册里搜「上海」就能找到那次旅行。Takeout 之后,同一批照片一点位置信息都没有。新的相册软件里地图是空的。有人告诉你 GPS 在 .json 文件里,你打开一个,看到 0.0。
下面讲发生了什么,以及你实际能找回多少。
两个位置字段,各是什么意思
每个 Takeout 附属文件有两个位置区块:
"geoData": {
"latitude": 31.2304,
"longitude": 121.4737,
"altitude": 12.0,
"latitudeSpan": 0.0,
"longitudeSpan": 0.0
},
"geoDataExif": {
"latitude": 31.2304,
"longitude": 121.4737,
"altitude": 12.0
}
geoDataExif 是你上传时照片自己的 EXIF 里的位置。手机相机打了 GPS,就在这里。geoData 是 Google 相册使用的位置,一开始和前者一样,但还包括你在 App 里手动设置或修正的地点。
两个区块的纬度和经度都是 0.0,说明这张照片没有位置。那不是一个真实地点,是 Google 表示「未知」的写法。处于这种状态的照片很多,比人们预期的多。
为什么这么多照片没有 GPS
手机只在相机有定位权限时才写坐标。很多人关掉了。截图、微信图片、下载的图片和扫描件从来没有 GPS。老相机根本没有接收器。
Google 相册把这一点藏起来了。它根据你的位置记录和照片里认出的地标猜测位置,并在 App 里显示这些猜测。这些估算的位置不在附属文件里。只有明确的位置才在:来自 EXIF 的,或者你手动设置的。
我们实测过一个 991 张照片的 Takeout 分卷,12% 的附属文件有真实坐标,81% 是 0.0 占位符。你的相册会不一样,但如果你在 Google 相册里能搜到从没打过地理标签的照片,那个搜索靠的是你没拿回来的估算。
为什么文件本身也没有 GPS
对于 EXIF 里本来就有 GPS 的照片,Takeout 通常连 EXIF 一起原样返回。所以很多相机照片仍然带着坐标,只是你搬去的那个软件还没索引,或者在看另一个字段。
例外是上传前 EXIF 被去掉的照片,以及你在 Google 相册里设置了位置的照片。对这些照片,附属文件是唯一的副本。没合并就删了附属文件,位置就没了。
检查你实际有什么
用 exiftool:
exiftool -r -if 'not $GPSLatitude' -ext jpg -ext heic -filename .
列出文件里没有 GPS 的图片。再和 geoData 非零的附属文件对比,可以这样 grep:
grep -L '"latitude": 0.0' *.json
两者的交集就是能恢复的部分。
手动写回坐标
exiftool 可以把附属文件的 geoData 复制进 EXIF 的 GPS 标签:
exiftool -r -tagsfromfile "%d/%F.supplemental-metadata.json" \
-if '$GeoDataLatitude ne 0 or $GeoDataLongitude ne 0' \
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
"-GPSAltitude<GeoDataAltitude" \
-ext jpg -ext jpeg -ext heic -overwrite_original .
-if 那一行很重要。没有它,你会把 0.0, 0.0 写进几百张照片,新软件的每个地图视图都会在西非外海的大西洋上出现一团照片。Ref 标签取坐标的正负号,所以从同一个值设置。
旧格式的导出换成 "%d/%F.json" 再跑一遍。截断的附属文件名和 (1) 重复要特别处理,见 exiftool 修复指南。
用软件写回
Takeout JSON Metadata Fixer 做同样的事,不用命令行,支持 Windows、Linux 和 Mac。
它先读 geoData,再读 geoDataExif,再读文件里已有的 GPS,把坐标写进照片的 EXIF。它把 0.0, 0.0 当作未知,让这些照片保持没有位置,而不是放到海里。日期同时写入,因为这两个问题几乎总是一起出现。
想把地点放进文件名或文件夹,软件可以把坐标变成城市名,给你 2019-07-14-1105_Shanghai.jpg,或者 2019/Shanghai 这样的文件夹。这个查询用的是 OpenStreetMap,需要联网,发送给对方的只有取整后的坐标,没有别的。关掉它,软件就完全离线运行。没有位置的照片文件名里就没有地点。
前 1000 张照片免费。之后一次性 19.99 美元解除限制。
从来没有位置的照片
导出里没有任何东西能恢复一个从没记录过的位置。但你可以自己加。苹果照片、digiKam 和 Immich 都允许把照片拖到地图上。批量的话,exiftool 可以给整个文件夹设同一组坐标。软件也可以按文件夹手动设置一个地点,输入城市名或坐标都行。方法见给没有 GPS 的照片添加位置。
常见问题
Google 相册明明显示了这张照片的位置,为什么附属文件是零?
因为那个位置是从你的位置记录或图片内容估算出来的,估算不导出。只有来自文件或手动编辑的坐标才导出。
该用 geoData 还是 geoDataExif?
geoData 包含你的手动修正,其他情况下和 geoDataExif 相同。用 geoData,它是零就退回 geoDataExif。
合并后 Immich 或苹果照片会读 GPS 吗?
会。两者都读标准的 EXIF GPS 标签,合并写的就是那里。Immich 重新索引文件后会在地图视图里显示。
为了隐私能反过来删掉 GPS 吗?
能。exiftool -gps:all= -overwrite_original . 把一个文件夹里的 GPS 全去掉。如果你还想用带地点的文件夹名,整理完再删。