app

  • 年初还说今年认真写写博客,一转眼好几个月没更新。开始更起来吧… 😭

    前几天粗算了一下,到目前为止今年大概有两个月以上的时间都在旅行,今年使用相机拍摄的照片数量几乎赶上了过去两年。开始用 4TB 的 iCloud 之后,我开始将我所有的照片都放在 iCloud,这样的好处是让照片不再成为硬盘上一个吃灰的文件,而是可以通过 Memories 功能或者 Widgets 随时查看。

    我使用相机比手机拍摄数量多很多,然而手机的照片自带 GPS 坐标信息,而数码相机的通常没有,这样 Memories 在生成回忆时,或者我基于位置(Location)来回看照片时非常不方便。

    所以今年上半年,我就开始研究如何最快的方式为数码相机拍的照片,无论是 jpeg 还是 RAW 文件的 EXIF 添加 GPS 信息。

    为数码相机照片添加 GPS 信息

    在我搜索的时候,已经有很多解决方式,包括为相机添加外置硬件、使用 iOS 端的专用 App 记录,再通过 exiftool 写入照片。我自己也曾经尝试了一段时间使用 iOS 自带的健身 App 记录徒步路线,再导出 .gpx 轨迹信息。甚至一度打开 XCode 准备自己写一个 App 解决这个问题。然而最麻烦的是在记录 GPS 信息的时候,都需要主动开启 — 而很多时候你又会忘记这件事情。

    今天我来介绍一种最方便的方法:

    在手机记录轨迹:

    目前最方便的方式是使用一生足迹App。这个 App 可以在后台自动记录 iPhone 的轨迹信息,也支持读取 iPhone 图库已有照片的 GPS 信息 — 也就是无需手动开启记录。它同时支持将所有轨迹信息导出为 .csv 文件,将数据私有化,这为后面做照片匹配提供了基础。

    一生足迹 App Store 截图

    在 Mac 端匹配:

    目前我找到最好用的是一款叫 HoudahGEO 的 App,它支持导入 .csv / .gpx,同时通过时间戳批量匹配坐标,以及批量编辑 EXIF,它也支持操作 Lightroom 与 iCloud 图库。整个流程也非常简单,导入 .gpx / .csv,自动匹配,批量导出写入 EXIF。

    注意,它是一款付费软件,大概 291 人民币,同时需要安装 java runtime。

    HoudahGEO 截图

    如果你使用 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 图库,你就得到了一张带有地理位置信息的照片记录。✌️