年初还说今年认真写写博客,一转眼好几个月没更新。开始更起来吧… 😭
前几天粗算了一下,到目前为止今年大概有两个月以上的时间都在旅行,今年使用相机拍摄的照片数量几乎赶上了过去两年。开始用 4TB 的 iCloud 之后,我开始将我所有的照片都放在 iCloud,这样的好处是让照片不再成为硬盘上一个吃灰的文件,而是可以通过 Memories 功能或者 Widgets 随时查看。
我使用相机比手机拍摄数量多很多,然而手机的照片自带 GPS 坐标信息,而数码相机的通常没有,这样 Memories 在生成回忆时,或者我基于位置(Location)来回看照片时非常不方便。
所以今年上半年,我就开始研究如何最快的方式为数码相机拍的照片,无论是 jpeg 还是 RAW 文件的 EXIF 添加 GPS 信息。
![为数码相机照片添加 GPS 信息](https://fri.sh/blog/wp-content/uploads/2023/10/Screenshot-2023-10-22-at-21.24.04-1024x498.png)
在我搜索的时候,已经有很多解决方式,包括为相机添加外置硬件、使用 iOS 端的专用 App 记录,再通过 exiftool 写入照片。我自己也曾经尝试了一段时间使用 iOS 自带的健身 App 记录徒步路线,再导出 .gpx 轨迹信息。甚至一度打开 XCode 准备自己写一个 App 解决这个问题。然而最麻烦的是在记录 GPS 信息的时候,都需要主动开启 — 而很多时候你又会忘记这件事情。
今天我来介绍一种最方便的方法:
在手机记录轨迹:
目前最方便的方式是使用一生足迹App。这个 App 可以在后台自动记录 iPhone 的轨迹信息,也支持读取 iPhone 图库已有照片的 GPS 信息 — 也就是无需手动开启记录。它同时支持将所有轨迹信息导出为 .csv 文件,将数据私有化,这为后面做照片匹配提供了基础。
![一生足迹 App Store 截图](https://fri.sh/blog/wp-content/uploads/2023/10/Screenshot-2023-10-22-at-21.38.22-1024x470.png)
在 Mac 端匹配:
目前我找到最好用的是一款叫 HoudahGEO 的 App,它支持导入 .csv / .gpx,同时通过时间戳批量匹配坐标,以及批量编辑 EXIF,它也支持操作 Lightroom 与 iCloud 图库。整个流程也非常简单,导入 .gpx / .csv,自动匹配,批量导出写入 EXIF。
注意,它是一款付费软件,大概 291 人民币,同时需要安装 java runtime。
![HoudahGEO 截图](https://fri.sh/blog/wp-content/uploads/2023/10/Screenshot-2023-10-22-at-22.02.04-1024x509.png)
如果你使用 iPhone 自带健康 App 导出的 .gpx 健身轨迹信息,那么可以被 Houdah 直接使用。而如果你使用「一生足迹」App 导出的 .csv 文件,则会遇到一些小问题:因为这个 .csv 文件的时间列格式为 UTC 时间,而 Houdah 只能读取 ISO8601 格式时间戳。不过问题不大,我花 5 分钟通过 chatGPT 写一个简单的 Python 解决:
// 将一生足迹 App 导出的 .csv 文件中的时间戳信息变更为 ISO 8601 格式
// 以便 HoudahGEO 可以读取 Track og
import csv
from datetime import datetime
def convert_timestamp_to_iso8601(timestamp):
# 将时间戳转换为datetime对象
dt_object = datetime.utcfromtimestamp(int(timestamp))
# 将datetime对象格式化为ISO 8601格式
return dt_object.strftime('%Y-%m-%dT%H:%M:%SZ')
def process_csv(input_file, output_file):
with open(input_file, 'r', newline='', encoding='utf-8') as infile, \
open(output_file, 'w', newline='', encoding='utf-8') as outfile:
reader = csv.DictReader(infile)
fieldnames = reader.fieldnames
if 'dataTime' not in fieldnames:
print("dataTime列不存在")
return
writer = csv.DictWriter(outfile, fieldnames=fieldnames)
writer.writeheader()
for row in reader:
# 转换时间为ISO 8601格式
row['dataTime'] = convert_timestamp_to_iso8601(row['dataTime'])
writer.writerow(row)
# 使用
input_file = 'backUpData.csv' // 一生足迹 App 导出的 .csv 文件
output_file = 'newData.csv' // 转换后的 .csv 文件
process_csv(input_file, output_file)
最后,导入到 iCloud 图库,你就得到了一张带有地理位置信息的照片记录。✌️
![](https://fri.sh/blog/wp-content/uploads/2023/10/Untitled-15.003-1024x604.jpeg)