Cartographic
经纬高三元组,经度和纬度用弧度。它和 Cartesian3 是同一点的两套坐标表示, 互转由静态方法完成。
| 属性 | 单位 | 取值范围 |
|---|---|---|
longitude | 弧度 | -π 到 π |
latitude | 弧度 | -π/2 到 π/2 |
height | 米 | 海拔,可以是负数(死海、矿井) |
构造与互转
| 方法 | 方向 | 说明 |
|---|---|---|
Cartographic.fromDegrees(lng, lat, h) | 度 → 弧度对象 | 最常用,输入是度 |
Cartographic.fromCartesian(cartesian) | Cartesian3 → Cartographic | 拾取结果转换 |
Cartographic.toCartesian(carto) | Cartographic → Cartesian3 | 给实体或相机定位 |
Cartographic.clone(carto) | 复制 | 避免共享引用 |
Cartographic.equals(a, b) | 比较 | 三个分量完全相等才算真 |
// 度 → Cartographic → Cartesian3
var carto = Cesium.Cartographic.fromDegrees(116.391263, 39.907359, 60);
var position = Cesium.Cartographic.toCartesian(carto);
// 反过来:屏幕拾取得到一个 Cartesian3
var picked = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
if (Cesium.defined(picked)) {
var c = Cesium.Cartographic.fromCartesian(picked);
console.log(Cesium.Math.toDegrees(c.longitude).toFixed(6),
Cesium.Math.toDegrees(c.latitude).toFixed(6),
c.height.toFixed(2));
}
读写经纬高
三个属性都可写。要修改位置时可以直接改分量,也能整体替换:
var c = Cesium.Cartographic.fromDegrees(116.39, 39.90, 0);
c.height = 120; // 抬高 120 米
c.longitude = Cesium.Math.toRadians(116.45); // 向东移
// 相机当前位置:直接读,不必先转 Cartesian3
var cam = viewer.camera.positionCartographic;
console.log(Cesium.Math.toDegrees(cam.longitude));
console.log(Cesium.Math.toDegrees(cam.latitude));
console.log(cam.height);
camera.positionCartographic、globe.pick 之后的转换、
entity.position.getValue(time) 之后的转换,是三个最常见的取值入口。
与 Rectangle 的关系
Cesium.Rectangle 用四个弧度值描述范围(西、南、东、北)。
单个点不能直接当范围用,但计算包围范围时经常需要从点集合推到矩形:
var rect = Cesium.Rectangle.fromDegrees(116.0, 39.6, 116.8, 40.2);
var center = Cesium.Rectangle.center(rect, new Cesium.Cartographic());
console.log(Cesium.Math.toDegrees(center.longitude));
三个常见错误
1. 用度构造
new Cesium.Cartographic(116.39, 39.90, 0) 的经度值 116 弧度约等于 18 圈,
Cesium 会把它折算到 -π 到 π 之间,位置完全不对且不报错。构造一律用
fromDegrees。
2. 打印时忘了转度
弧度 1.0 打印出来是 1.0,看起来像 1 度,实际是 57.3 度。
所有面向用户的输出都要经过 Cesium.Math.toDegrees。
3. 把结果对象重复使用
Cartographic.fromCartesian(p, ellipsoid, result) 支持复用 result。
如果传了同一个 result 给多处逻辑,后写入的值会覆盖前面的。跨函数传递时应 clone。
经纬志(2026)。《Cartographic》。https://www.jingweizhi.com/cesium/api/cartographic.html(访问日期 2026-11-03)。