
Cesium中的坐标系及其转换引言Cesium作为一款强大的三维地球和地图可视化引擎其核心魅力在于能够在虚拟空间中精准地表达地理信息。而这一切的基础正是Cesium中精心设计的坐标系系统。无论是放置一个标记、绘制一条航线还是模拟卫星运动都离不开对坐标系的理解和运用。本文将系统介绍Cesium中的主要坐标系并详细说明它们之间的转换方法帮助你在开发中游刃有余地处理各种空间数据。一、Cesium中的主要坐标系Cesium涉及四类核心坐标系它们分别服务于不同的应用场景。1.1 屏幕坐标Cartesian2屏幕坐标是二维笛卡尔坐标系以像素为单位描述屏幕上的位置。其原点位于屏幕Canvas的左上角水平向右为X轴正方向垂直向下为Y轴正方向。// 创建一个屏幕坐标点 (x100, y200)constscreenPositionnewCesium.Cartesian2(100,200);屏幕坐标常用于处理鼠标交互例如获取鼠标点击位置的像素坐标。1.2 笛卡尔空间直角坐标Cartesian3笛卡尔空间直角坐标又称世界坐标是Cesium中最核心的坐标系。它以地球几何中心为原点使用米作为单位通过Cesium.Cartesian3(x, y, z)表示。在这个坐标系中X轴指向本初子午线与赤道的交点Y轴指向东经90度经线与赤道的交点Z轴指向北极// 创建一个笛卡尔坐标点constworldPositionnewCesium.Cartesian3(1215000.0,-4736000.0,4081000.0);重要提示Cesium平台内所有用到坐标的地方核心都是Cartesian3对象。无论是实体位置、相机位置还是模型变换最终都会转换为Cartesian3进行计算。1.3 地理坐标Cartographic地理坐标是更符合人类认知的坐标系它基于WGS84椭球体模型使用经度、纬度、高度来描述位置。但在Cesium内部地理坐标的经度和纬度是以弧度而非角度存储的。// 创建地理坐标弧度制constcartographicnewCesium.Cartographic(Cesium.Math.toRadians(116.3975),// 经度116.3975度转弧度Cesium.Math.toRadians(39.9075),// 纬度39.9075度转弧度50.0// 高度50米);由于弧度值对人不直观我们通常通过工具函数进行度和弧度的转换// 度转弧度constradiansCesium.Math.toRadians(degrees);// 弧度转度constdegreesCesium.Math.toDegrees(radians);1.4 参考框架地固系与地惯系除了上述基础坐标系Cesium还提供了两个重要的参考框架概念用于处理动态的空间关系。地固系FIXED / ECEF地固系Earth-Centered, Earth-Fixed是Cesium的默认参考框架。在这个框架中地球本身是静止的星空围绕地球旋转。它适用于大多数需要将物体固定在地球表面上的场景如标记城市、绘制道路等。地惯系INERTIAL / ICRF地惯系Earth-Centered Inertial在Cesium中称为ICRF国际天文参考坐标系。在这个框架中星空是静止的地球自身在旋转。它对于需要精确模拟天体运动和卫星轨道的场景至关重要。// 在CZML中指定使用惯性参考系{id:satellite,position:{referenceFrame:INERTIAL,// 设置为惯性系cartesian:[x,y,z]// 惯性系下的坐标}}二、坐标系之间的转换理解了各类坐标系后掌握它们之间的转换方法同样重要。Cesium提供了丰富的API来完成这些转换。2.1 WGS84地理坐标 ↔ 笛卡尔坐标这是开发中最常用的转换。Cesium提供了便捷的静态方法可以直接将经纬度度转换为笛卡尔坐标。// 经纬度度→ 笛卡尔坐标constpositionCesium.Cartesian3.fromDegrees(116.3975,// 经度39.9075,// 纬度50.0// 高度米);// 批量转换多个点不带高度constpositionsCesium.Cartesian3.fromDegreesArray([116.3975,39.9075,121.4737,31.2304]);// 批量转换多个点带高度constpositionsWithHeightCesium.Cartesian3.fromDegreesArrayHeights([116.3975,39.9075,50.0,121.4737,31.2304,20.0]);逆向转换笛卡尔 → 地理坐标同样简单// 笛卡尔坐标 → 地理坐标弧度制constcartographicCesium.Cartographic.fromCartesian(cartesian3);// 或使用椭球体方法constcartographic2Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);// 弧度制转角度制constlongitudeCesium.Math.toDegrees(cartographic.longitude);constlatitudeCesium.Math.toDegrees(cartographic.latitude);constheightcartographic.height;2.2 屏幕坐标 ↔ 笛卡尔坐标屏幕坐标与笛卡尔坐标的转换常用于实现鼠标拾取功能。屏幕坐标 → 笛卡尔坐标有三种层次// 1. 获取包含地形、模型、倾斜摄影的坐标constpickPositionviewer.scene.pickPosition(screenCoord);// 2. 获取地球表面坐标包含地形不包含模型constglobePositionviewer.scene.globe.pick(viewer.camera.getPickRay(screenCoord),viewer.scene);// 3. 获取参考椭球面坐标不包含地形和模型constellipsoidPositionviewer.scene.camera.pickEllipsoid(screenCoord);笛卡尔坐标 → 屏幕坐标使用SceneTransforms工具// 将世界坐标转换为窗口坐标像素位置constwindowCoordCesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,worldPosition);// 如果需要考虑高分屏适配可使用wgs84ToDrawingBufferCoordinatesconstdrawingBufferCoordCesium.SceneTransforms.wgs84ToDrawingBufferCoordinates(viewer.scene,worldPosition);2.3 空间位置变换坐标转换的最终目的往往是为了进行空间变换。Cesium提供了强大的数学工具支持工具类用途Cesium.Cartesian3表示三维点、向量Cesium.Matrix33x3矩阵描述旋转变换Cesium.Matrix44x4矩阵描述旋转平移变换Cesium.Quaternion四元数描述绕任意轴的旋转Cesium.Transforms参考系转换工具重要原则所有空间变换平移、旋转、缩放都需要在笛卡尔坐标系Cartesian3中进行。三、参考框架转换实战3.1 将相机固定在惯性系默认情况下Cesium使用地固系地球静止。如果要观察卫星在惯性系中的运动需要将相机固定在惯性系中让地球旋转起来// 每一帧更新时将相机固定在ICRF惯性系需要开启动画shouldAnimate及加快倍速更明显functionicrf(scene,time){if(scene.mode!Cesium.SceneMode.SCENE3D){return;}// 计算ICRF到地固系的旋转矩阵consticrfToFixedCesium.Transforms.computeIcrfToFixedMatrix(time);if(Cesium.defined(icrfToFixed)){constcameraviewer.camera;constoffsetCesium.Cartesian3.clone(camera.position);consttransformCesium.Matrix4.fromRotationTranslation(icrfToFixed);camera.lookAtTransform(transform,offset);}}// 添加帧更新监听viewer.scene.postUpdate.addEventListener(icrf);这段代码的效果是星空和卫星轨道保持静止而地球在画面中缓慢旋转。3.2 在惯性系中计算月球位置对于需要精确模拟天体运动的场景可以使用Simon1994PlanetaryPositions计算月球在惯性系中的位置consttimeCesium.JulianDate.now();constmoonPositionnewCesium.Cartesian3();Cesium.Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame(time,moonPosition);console.log(月球在惯性系中的位置:,moonPosition);总结Cesium的坐标系系统可以归纳为三个层次坐标系类型表示方式单位应用场景屏幕坐标Cartesian2像素鼠标交互、UI定位笛卡尔坐标Cartesian3米空间计算、模型变换地理坐标Cartographic弧度/米数据输入输出参考框架FIXED/INERTIAL-动态场景模拟掌握这些坐标系及其转换方法是高效开发Cesium应用的基础。无论是简单的地理标记还是复杂的卫星轨道模拟你都能找到合适的工具和API来精确表达你的空间数据。