2023 年 1 月 25 日,我从重庆北站进城。上午的雾把江面和楼群压成了很浅的灰,下午沿着山城起伏的道路慢慢走,到傍晚,洪崖洞的灯一层层亮起来。那天拍了很多照片,回家后却和大多数旅行影像一样,只按文件名和时间躺在相册里。
照片当然还在,但“这一天是怎样走过的”已经很难从相册中看出来。Photo Walk 就是从这个小问题开始的:让照片回到拍摄时间与地图位置上,再把它们整理成一段可以浏览、分享和嵌入博客的旅程。
2023 年 1 月 25 日 11:40,雾中的重庆。地图上的一个点,也是一段记忆重新出现的位置。
把相册重新变成一天
这次我从当天的照片里整理出 22 张,其中 21 张带有位置。作品从 09:54 延续到 20:57,照片 GPS 形成 49 个轨迹点,按时间连接后的长度约为 22.7 公里。
数字只是索引,真正有意思的是照片之间重新有了关系:车站是开头,江面和高楼在中午出现,天色暗下来后,洪崖洞成为这一天的结尾。点击地图上的点,可以看到当时拍下的画面;沿着时间线移动,则能重新经历光线从白天到夜晚的变化。
下面是这次导出的完整交互作品。可以拖动地图、点击照片点,也可以切换到时间线浏览。手机上建议横向拖动查看地图,点击“全屏打开”会更舒展。
重庆 2023:22 张照片组成的一日影像路线。也可以全屏打开作品。
需要说明的是,这条线并不等于真实、连续的步行路线。没有 GPX 时,Photo Walk 只是依照时间连接照片中的 GPS 位置;中间可能乘坐地铁、汽车,也可能有很长一段没有拍照。它更像一条“照片出现过的路径”。如果同时导入运动相机或轨迹应用记录的 GPX,才会得到更接近实际移动过程的连续轨迹。
选片不应该破坏轨迹
大量照片导入后,最费时间的通常不是地图,而是决定哪些照片值得被看到。
Photo Walk 会先读取照片的拍摄时间、尺寸与 EXIF 位置,再让照片按时间排列。可以从“故事精选”开始,也可以自己逐张选择。这里有意把两件事分开:
- 参与轨迹:照片的位置继续作为当天路线的锚点。
- 出现在故事中:照片会进入最终画廊,供读者查看。
因此,一张照片即使构图普通、不想公开,也可以只留在轨迹里而不展示。反过来,从精选故事里移除一张照片,不会顺手把当天的路线截断。对我来说,这比简单的“选中 / 删除”更符合整理旅行照片时的真实想法。
拍摄时间也可以校正。有些手机、相机或云端导出的时间采用 UTC,直接读取会与中国标准时间相差 8 小时;Photo Walk 可以设置作品时区,让地图、时间线和导出结果使用同一套时间。
从作品到博客
Photo Walk 的编辑过程在浏览器本地完成。导入照片后,可以选择 OpenStreetMap,也可以填写自己的高德地图 Web Key 与安全密钥。整理完成后,作品可以导出为:
- 一个可直接部署的静态目录;
- 适合本地打开或轻量分享的单 HTML;
- 可嵌入 Astro 的组件片段;
- 可粘贴进普通 HTML 页面的 iframe 片段。
导出时照片会转换并压缩为 WebP,因此即使照片较多,成品也不会把原图体积原封不动地带进博客。这篇文章里的互动地图就是目录版导出,没有 Photo Walk 后端,和普通静态页面一样由博客站点提供。
关于隐私和地图密钥
原始照片不会上传到 Photo Walk 的服务器;它们只在当前浏览器中读取和处理。导出的 WebP 不保留原始 EXIF,不过公开作品中的地图点本身仍然会透露拍摄位置,所以住所、工作地点或其他敏感地点仍应在发布前移除。
高德地图是另一层问题。浏览器地图必须拿到 Web Key 才能工作,因此静态页面无法真正把它藏起来。正式发布时应当使用专门为网站创建的 Key,设置严格的域名白名单、调用配额和用量告警;不要复用具有其他权限的密钥,也不要把服务端密钥放进作品。如果不希望维护这些配置,可以继续使用不需要个人 Key 的 OpenStreetMap 底图,并遵守其瓦片服务使用政策。
Photo Walk 目前作为开源项目发布,代码和使用说明在 GitHub。当然,Photo Walk现在还比较简陋,还需要时间进行不断的升级、优化。它不会替我选择哪张照片最重要,也不能把离散 GPS 点变成一条从未记录过的真实路线;它做的只是把相册里原本分开的时间、位置和画面重新放到一起。
三年后再看这一天,我记住的不只是洪崖洞的灯。更清楚的是,自己如何从车站进入一座陌生城市,又怎样在雾、江水和夜色之间走完了它。