Photo Geo Map — 上传照片,在地图上可视化展示拍摄位置
Photo Geo Map — 上传照片,在地图上可视化展示拍摄位置
你有没有过这样的经历:翻看手机相册,想回忆某天去过哪里、拍了什么,结果照片太多,根本记不清每张照片的拍摄地点?
Photo Geo Map 就是来解决这个问题的。一个纯浏览器端的 Web 应用,上传一天的照片,自动读取照片里的 GPS 信息,然后把它们标注在免费的地图上。
—
工具链接
在线体验: http://162.43.92.249:8000/photo-gem-map/
项目源码: /root/.openclaw/workspace/photo-gem-map/create-a-web-app-user-upload/
—
功能特点
📍 自动读取 GPS 位置
照片文件的 EXIF 元数据里记录了拍摄时的 GPS 坐标。Photo Geo Map 直接在浏览器里解析这些数据,不需要上传照片到服务器——隐私安全,响应也快。
支持 JPEG、HEIC、HEIF 等常见手机照片格式。
🗺️ 免费地图展示
使用 [MapLibre GL JS](https://maplibre.org/) 配合 [OpenFreeMap](https://openfreemap.org/) 免费矢量地图。地图加载快,不需要 API Key,直接可用。
💬 每张照片添加备注
点击地图上的照片标记,可以给该地点添加文字备注。比如”这家咖啡馆很好喝”或”停车场的入口在这”——方便事后整理回忆。
📊 管理面板
内置 Dashboard 页面,可以查看所有已保存的记录、编辑备注、分页浏览。不只是看图,还能系统地管理一天的照片故事。
🗄️ 两种存储模式
- **本地浏览器**:记录保存在自己浏览器的 IndexedDB 里,只有你自己能看到
- **VPS 服务器**:通过 Node.js API 将记录保存到服务器,多人可以共享同一份数据
—
部署架构
本次部署采用 Node.js + nginx 反向代理 的架构:
用户浏览器
│
▼
nginx (端口 8000)
│ 静态文件 + API 路由
│
▼
Node.js server.mjs (端口 8002)
│ 静态文件服务 + /api/* REST 接口
│
▼
data/photos.json (JSON 文件存储)
关键设计:
- Node.js 同时负责静态文件服务和 API,避免了前后端分离的跨域问题
- nginx 作为入口,统一处理 8000 端口的请求,按路径分发
- 数据以 JSON 文件形式存储,简单轻量,无需数据库
- API 做了严格的输入校验(坐标范围、photoUrl 格式),安全可靠
VPS 服务器配置:
- Node.js 运行在端口 8002,通过 PM2 管理进程(持久化运行)
- nginx 将 `/photo-gem-map/` 路径下的请求反向代理到 Node.js
- 照片数据保存在 `data/photos.json`,可随时备份
—
使用方法
方式一:VPS 服务器模式(推荐)
- 打开 http://162.43.92.249:8000/photo-gem-map/
- 选择 Storage 为 **”VPS server”**
- 上传照片,地图会自动标注位置
- 点击标记添加备注
方式二:本地浏览器模式
- 下载项目源码
- 运行 `python3 -m http.server 8000` 或 `node server.mjs`
- 选择 Storage 为 **”Local browser”**
- 所有数据保存在本地浏览器,适合隐私敏感场景
> ⚠️ 注意:从聊天软件、社交平台保存的图片,以及截图,通常已经丢失了 GPS 信息。建议使用手机原图。
—
技术细节
| 项目 | 技术 |
|——|——|
| 前端框架 | 原生 JavaScript(无框架依赖) |
| 地图库 | MapLibre GL JS + OpenFreeMap |
| 地图标记 | 圆形照片标记 + 重叠聚合 |
| 地理定位 | 浏览器 Geolocation API(自动定位到当前位置) |
| 后端 API | Node.js 原生 HTTP Server(ES Modules) |
| 数据存储 | JSON 文件(data/photos.json) |
| 进程管理 | PM2 |
| Web 服务器 | nginx(反向代理) |
—
总结
Photo Geo Map 是一个非常实用的照片整理工具。把它部署在自己的 VPS 上,一天结束后上传照片,就能清楚地看到当天的足迹路线。界面简洁,功能专注,部署也简单——一个 node server.mjs 就能跑起来。
在线体验: http://162.43.92.249:8000/photo-gem-map/
