| 导航:返回目录 | 上一章:从 nadir 到三维 | 下一章:室内地图构建与 BIM 融合 |
在前几章中,我们构建了数字地球的骨架:卫星影像提供了宏观的地表覆盖,DEM 赋予了地形起伏,倾斜摄影模型重建了城市的立体轮廓。然而,这些数据都有一个共同的局限——它们都是俯视的。
街景(Street View) 是地图体系中唯一提供平视(Ego-centric) 体验的数据源。它填补了 GIS 数据与人类真实感知之间的“最后一公里”。在这一层级,我们不再关心“屋顶是什么颜色”,而是关心“商店招牌写了什么”、“路面是否有坑洼”以及“站在路口能否看到地标建筑”。
本章将揭开街景技术的黑盒。我们将从移动测量系统(MMS)的硬件采集讲起,剖析全景图的球面投影原理与切片金字塔结构,详细推导从地图坐标到全景视角的几何变换公式,并探讨街景背后的隐形数据——深度图(Depth Map)与全景拓扑图(Pano Graph)。
街景采集车(或背包、手推车)本质上是一个移动测量系统(Mobile Mapping System, MMS)。它并不是简单地拍照片,而是在高速运动中同步记录空间位置与姿态。
一个标准的街景采集单元通常包含以下核心组件,它们通过微秒级的时间同步机制协同工作:
Rule of Thumb (经验法则): 街景图像中的“北方”并不一定是图片的上方或正中心。原始图像是相对于车头方向拍摄的。必须结合 IMU 记录的偏航角(Yaw / Heading),在后处理中将图像“旋转”对齐到地理正北,才能在地图应用中正确使用。
为了将球面的全景图存储为一张二维图片文件(如 JPEG),最通用的标准是等距长方投影。
ASCII 示意图:投影网格
(0,0) 图片左上角
+-----------------------------------------+ 纬度 +90 (极点被拉伸为一条线)
| / \ / \ |
| / \ / \ |
| / \ / \ |
|---|---------|-------------|---------|---| 纬度 0 (赤道,无变形)
| \ / \ / |
| \ / \ / |
| \ / \ / |
+-----------------------------------------+ 纬度 -90 (南极点被拉伸为一条线)
经度: -180 -90 0 +90 +180
与卫星地图类似,高分辨率的街景(例如 14000 x 7000 像素)不会一次性加载。它同样采用了瓦片金字塔结构:
注意:这里的“Zoom”是全景图内部的缩放级别,与地图底图的 Zoom Level 是两套独立的系统。
在 Web 开发中(如使用 Google Street View API 或 Mapbox SDK),核心挑战在于如何控制“虚拟相机”的参数,使其精准指向我们想要展示的目标。
FOV 决定了画面的“缩放程度”。
为了让街景相机自动“盯着”某个 POI,我们需要计算从相机位置到目标位置的大圆航线方位角。
设定:
计算公式(Bearing Formula):
\[\theta = \operatorname{atan2}(y, x)\]\(y = \sin(\lambda_2 - \lambda_1) \cdot \cos(\phi_2)\) \(x = \cos(\phi_1) \cdot \sin(\phi_2) - \sin(\phi_1) \cdot \cos(\phi_2) \cdot \cos(\lambda_2 - \lambda_1)\)
最后将 $\theta$ 从弧度转换为角度,并归一化到 $0^\circ \sim 360^\circ$。
这是初学者容易忽略的一点。街景相机通常位于车顶(约 2.5米 - 3米高)。
估算公式: 假设目标物体的高度为 $H_{obj}$,相机高度为 $H_{cam}$,两点地面距离为 $D$。
\[\text{Pitch} \approx \arctan\left( \frac{H_{obj} - H_{cam}}{D} \right)\]Rule of Thumb (参数策略): 在调用 API 展示某个 POI 时,不要仅仅传入 POI 的坐标。
- 先用 POI 坐标搜索最近的全景 ID (PanoID)。
- 获取该 PanoID 的真实坐标(这是相机位置)。
- 利用相机位置和POI 坐标计算 Heading 和 Pitch。 这样能确保用户看到的画面正对目标,而不是背对着目标看马路对面。
Google Street View 等高级服务会在后台存储一张与全景图对应的深度图。这是一张灰度图或 Base64 编码的数组,每个像素的值代表该像素点距离相机的物理距离(米)。
街景不是孤立的点,而是一个有向图(Directed Graph)。
当用户点击画面上的“前进箭头”时,程序实际上是在遍历这个图结构,寻找与当前视线方向(Heading)夹角最小的那条边,加载下一个节点的数据。
(lat, lon) 的街景,API 返回了图像,但当你把这个图像的坐标反向打点到地图上时,发现它偏离了原坐标 50 米。imageDate 字段。StreetViewSource.OUTDOOR 和 StreetViewSource.DEFAULT,对于非官方数据源要有容错机制。| 导航:返回目录 | 上一章:从 nadir 到三维 | 下一章:室内地图构建与 BIM 融合 |