kluter/TracePoint
GitHub: kluter/TracePoint
TracePoint 是一个基于浏览器的工具,利用几何光线交叉从照片中定位拍摄原点。
Stars: 6 | Forks: 0
TracePoint
**利用几何光线交叉定位照片的拍摄原点。**
**[在线体验 → kluter.github.io/TracePoint](https://kluter.github.io/TracePoint/)**

## 方法
在照片上画一条垂直线,它会穿过不同深度的物体:前景、中景、地平线。每个物体都能在地图上找到,它们共同定义了一个地理方位:一条**射线**。
对第二条线重复此操作,就得到第二条射线。**射线交叉的地方就是摄影师站立的位置。**
添加的线越多,生成的射线就越多,交叉点的平均结果就越稳健。这是测量技术中**[交会法](https://en.wikipedia.org/wiki/Position_resection_and_intersection)**的一个摄影应用,其原理与通过已知地标进行三角测量相同。`TracePoint`将这种需要手动切换界面的工作流程转化为一个专注的工具。
## 功能
- 分屏界面:左侧照片,右侧卫星地图
- 拖放任意图片即可加载,或点击**浏览**
- **多图像会话管理器:**所有会话同时显示在地图上,每个会话有独立的交叉结果
- **方位显示:**找到交叉点后,每条线会显示其延伸方位
- **置信椭圆:**当使用3条或更多线(每张图片最多5条)时,交叉点周围会出现一个虚线椭圆,以可视化射线交叉点的分布。椭圆越紧密,置信度越高。通过[协方差矩阵特征分解](https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors)计算
- **会话导出与导入:**将线、地理坐标点、方位和地图视图保存为JSON格式并恢复
- **EXIF元数据查看器:**从图片中读取相机、镜头、拍摄设置、GPS、高度和相机朝向信息。GPS可作为参考标记放置在地图上
- 内置波茨坦演示及分步指南
- 倾斜图像的地平线校正
- 地图图层切换:Esri卫星图、OpenStreetMap、OSM人道主义地图、Esri地形图、Esri街道图
- 完整键盘快捷键支持
- 完全在客户端运行:无需服务器,无上传,无追踪
## 使用方法
1. **加载照片:**将图片拖放到左侧面板,或点击**浏览**。要同时处理多张图片,请打开**☰**图像菜单并点击**+ 添加图像**。
2. **添加线条:**点击**+ 新线**(或按`E`),然后在照片上拖动,划过一个你能在地图上识别的对象:建筑角落、塔楼、道路交叉口。
3. **标记点:**切换到**添加点**模式(或按`Tab`),在线上点击两次以精确放置两个参考点。
4. **在地图上放置点:**点击每个点旁边的**🌐 P1**胶囊按钮(或按`F`直接跳转到下一个未映射的点),然后在地图上点击其实际地理位置。
5. **读取结果:**一旦两条线各有两个地理坐标点,射线就会出现并计算交叉点。脉冲的黄色标记显示估计的相机原点。当有3条或更多线时,交叉点周围会出现置信椭圆:椭圆越紧密,方位线的一致性越高。
6. **添加更多图像:**使用**☰**图像菜单添加更多会话。每个会话在地图上同时显示其自己的射线和交叉点。
7. **保存工作:**点击任意会话行上的**↓**按钮将其导出为JSON,或使用**↓ 导出所有会话**一次性保存全部。要恢复,请点击**↑ 导入会话**,并在提示时重新加载图像。

## 理解读取置信椭圆
当使用三条或更多线时,估计的相机位置周围会出现一个虚线椭圆。其大小和形状告诉你对结果的信任程度。
| 椭圆形状 | 含义 | 置信度 |
|-------|---------|------------|
| 小而圆 | 射线从各个方向紧密收敛 | 高 |
| 小而长 | 估计良好,但沿一个轴不确定。两条线可能接近平行 | 中等 |
| 大而圆 | 各个方向普遍分散,重新检查地理坐标点或添加更多线 | 低 |
| 大而长 | 一个方位可能偏离,或两条线过于接近平行 | 低 |
理想结果是小而圆的椭圆。如果看到大的或细长的椭圆,通常在不同角度添加一条线可以显著改善结果。
## 控制方式
### 鼠标与界面
| 操作 | 方法 |
|---|---|
| 缩放图像 | 滚轮 |
| 平移图像 | 空格键 + 拖动,或中键拖动 |
| 校正水平 | 水平校正按钮,然后在水平参考线上点击两个点 |
| 重置水平校正 | 校正激活时再次点击水平校正按钮 |
| 添加线条 | + 新线按钮 |
| 拖动线条 | 点击并拖动线条 |
| 取消选择/取消 | 点击空白画布,或按 `Esc` |
| 添加点 | 添加点模式,在线上点击 |
| 在地图上放置点 | 点击地图胶囊按钮,然后点击地图 |
| 删除线条或点 | 线条栏上的 × 按钮 |
| 切换地图图层 | 地图面板右上角的 ☰ 按钮 |
| 管理图像会话 | 线条栏右侧的 ☰ 按钮 |
| 浏览图像 | 点击拖放区域 |
| 导出会话 | ☰ 菜单中会话行上的 ↓ 按钮 |
| 导出所有会话 | ☰ 菜单中的 ↓ 导出所有会话 |
| 导入会话 | ☰ 菜单中的 ↑ 导入会话 |
| 打开帮助指南 | 地图面板右上角的 ? 按钮 |
| 查看图像元数据 | 线条栏左侧的 `>` 按钮 |
| 将EXIF GPS放置在地图上 | 元数据卡片内的“在地图上显示” |
### 键盘快捷键
| 按键 | 操作 |
|---|---|
| `E` | 新线 |
| `R` | 删除活动线 |
| `F` | 映射活动线的下一个未映射点 |
| `W` | 切换水平校正工具/重置旋转 |
| `X` | 切换帮助卡片 |
| `Tab` | 切换拖动线条/添加点模式 |
| `1` – `5` | 跳转到线条1-5 |
| `Esc` | 取消/取消选择 |
## 技术说明
射线是根据两个地理坐标点之间的方位计算的。交叉点计算使用经纬度坐标的平面几何。对于小于约10公里的场景,精度在几米以内,这涵盖了几乎所有的实际摄影情况。每条射线向两个方向各延伸50公里,足够长以包含任何现实的交叉点,同时保持地图可读性。
当使用三条或更多线时,每对射线都会产生一个交叉点。这些交叉点在估计原点周围形成一个小的点云。置信椭圆通过[特征值分解](https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors)拟合到该点云上。椭圆在交叉点最分散的方向上拉伸,在它们一致的方向上保持狭窄。紧密的椭圆意味着线条收敛干净;宽大的椭圆意味着至少一个方位偏离。
没有数据离开您的设备。地图图像由公共瓦片服务器(Esri、OpenStreetMap)提供。依赖项包括用于地图的[Leaflet](https://leafletjs.com/)和MikeKovarik用于元数据解析的[exifr](https://github.com/MikeKovarik/exifr)。其他所有内容均为原生HTML、CSS和JavaScript。
## 本地运行
```
npx serve .
# 或
python3 -m http.server
```
## 更新日志
| 版本 | 更改内容 |
|---------|---------|
| v1.6.2 | 修复了每次放置地理坐标点时地图平移到交叉点的问题。 |
| v1.6.1 | EXIF GPS弹窗样式重新设计。GPS添加了复制按钮。修复了会话导入后的EXIF射线问题。 |
| v1.6.0 | EXIF方向射线:从GPS位置和相机方位绘制的射线。复制坐标按钮。 |
更早版本
| 版本 | 更改内容 | |---------|---------| | v1.5.0 | 键盘快捷键,3条以上线的置信椭圆,每张图最多5条线。 | | v1.4.3 | 线条栏重新设计:线条和点移至工具栏下方的专用栏。 | | v1.4.2 | 用户体验错误修复:孤立的地图射线、地图点模式未清除、自动缩放误触发。 | | v1.4.1 | 安全加固,JSON导入验证,Toast通知系统。 | | v1.4.0 | EXIF元数据查看器,带GPS地图标记。 | | v1.3.0 | 会话导出/导入,浏览按钮,方位显示。 | | v1.2.1 | 会话命名、颜色和地图视图修复。 | | v1.2.0 | 多图像会话管理器。 | | v1.1.0 | 地平线校正工具。 | | v1.0.0 | 初始版本。 |标签:CMS安全, EXIF元数据, JavaScript, SEO优化, Syscall, Web开发, 会话管理, 位置重测, 卫星地图, 图像处理, 地图API, 地理位置定位, 地理信息科学, 多模态安全, 射线交叉, 工具软件, 摄影测量, 数据可视化, 测绘技术, 照片分析, 照片溯源, 置信度椭圆, 自定义脚本, 计算机视觉