经纬志
首页 / Cesium / API 文档

Cartographic

先看结论

经纬高三元组,经度和纬度用弧度。它和 Cartesian3 是同一点的两套坐标表示, 互转由静态方法完成。

最后验证 2026-11-03 · CesiumJS 1.121 · 更新 2026-10-27 · 引用本文
new Cesium.Cartographic(longitude, latitude, height)
属性单位取值范围
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)。