Skip to content

地图投影与屏幕投影 ​

WebGIS 中的“投影”经常指两件事。地图投影(map projection)把弯曲地球映射为二维地图;图形学投影(graphics projection)把相机中的三维位置映射到屏幕。“映射”(mapping)就是为每个输入位置规定一个输出位置。前者回答“经纬度怎样铺平”,后者回答“从这里看过去,物体落在哪个像素”。使用三维地球并不意味着数据不再涉及地图投影。

角度数值不是地面距离。角度与单位说明弧度和米的关系;齐次坐标与投影补充相机投影的另一套数学含义。

平面地图一定有取舍 ​

等经纬展开保留直观的经纬网结构,但同样宽度的经度条带在高纬表示更小的实际面积。Web Mercator 常用于在线瓦片地图,局部形状便于辨认,越接近极区面积夸大越严重,不能覆盖真正的南北极。一个屏幕上很大的区域,不一定有更大的地表面积。

Cesium 的 GeographicProjection 用椭球最大半径乘以经纬弧度得到平面坐标;WebMercatorProjection 对纬度采用非线性变换(nonlinear transformation):纬度增加相同的量,输出的平面距离却不一定增加相同的量。两者输出有长度单位,但并不保证地图上任意位置的距离都等于真实地面距离。

以下计算片段假设已执行 import * as Cesium from 'cesium';这里省略模块导入,不需要为计算单独创建 Viewer。

js
const position = Cesium.Cartographic.fromDegrees(120, 60);
const geographic = new Cesium.GeographicProjection();
const mercator = new Cesium.WebMercatorProjection();
console.log(geographic.project(position));
console.log(mercator.project(position));

这段代码只比较坐标映射,不会切换当前相机。要显示二维地图,可以在 Viewer 初始化时指定 mapProjection,再使用二维场景模式;三维场景中的透视相机则是另一套变换。

纹理也需要正确的地理映射 ​

一张全球经纬网格图片不能仅凭“四角都是全球范围”就当作 Web Mercator 瓦片。它们在纬度方向的像素分布不同。把经纬图当成墨卡托图会让城市位置与天气中心错位,极区尤其明显。

日期变更线又是另一种边界:东经一百七十九度和西经一百七十九度相距很近,数值却相差三百五十八度。几何连线、纹理采样与包围范围都需要明确是否跨越这条接缝。

地球上的坐标系EXPERIMENT 02 · CESIUM 1.145.0

地球上的坐标系

移动经纬度,观察 ECEF 数值和局部 ENU 坐标轴。

在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放

底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码

此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。

读取源码…

观察任务: 保持纬度,分别把经度放在日期变更线两侧,观察位置是否邻近;再把同样大小的经纬跨度放到高纬。解释为何不能直接用经纬数值差测距。

展开解释

经度具有周期性,经度差必须考虑绕回;纬度改变时经线间距也改变。需要地表距离时,应选球面或椭球测地线(geodesic),即沿参考表面的局部最短路径。平面欧氏距离(Euclidean distance)用勾股关系计算,例如 sqrt(dx²+dy²);它只在合适的投影、范围和误差要求下近似地面距离。

官方延伸:GeographicProjection、WebMercatorProjection。

气象学 · 数学基础 · 地理可视化