专栏名称: 小猿猴GISer
GIS遥感交流学习
目录
相关文章推荐
环球人物  ·  “全世界最强壮的男孩”神秘消失始末 ·  昨天  
南方人物周刊  ·  宋佳 永远生机勃勃|2024魅力人物 ·  2 天前  
每日人物  ·  机票跌到200块,我却高兴不起来 ·  2 天前  
人物  ·  中年后,我还有哭的自由吗? ·  2 天前  
南方人物周刊  ·  哪吒敖丙“藕饼”大火,“得CP者得天下”? ·  3 天前  
51好读  ›  专栏  ›  小猿猴GISer

认识 Cesium 中的笛卡尔坐标系

小猿猴GISer  · 公众号  ·  · 2024-12-02 18:43

正文

1. 坐标系绘制效果

三维笛卡尔坐标系,也称之为 世界坐标系 ,坐标系的示意图示如下图所示:它以 地球的几何中心 为原点,x 轴指向 赤道平面和本初子午线的交点 (0 度经线),y 轴指向 赤道平面和 90 度经线(东经)的交点 ,z 轴指向 北极 。坐标点可以使用 Cesium.Cartesian3 来表示,单位为

注:经线从本初子午线向东、向西各为 0~180 度,东经为正,西经为负,纬度( 任意一点的纬度为该点的半径与赤道平面的夹角 )是以赤道为 0 度,向北、向南各为 0~90 度,向北为正,向南为负。我们在绘制坐标的示意线时注意正负号。

2. 代码实现

首先,我们利用 Cesium.DebugModelMatrixPrimitive 类先绘制出 x、y、z坐标轴 及坐标系 原点 ,然后,为了表示坐标系的定义,我们将 赤道 本初子午线 (0 度经线)也绘制了出来,具体的代码如下图所示:

注:代码参考了官方示例: https://sandcastle.cesium.com/?src=Parallels%20and%20Meridians.html&label=All

function addThreeDimensionalCartesianCoordinateSystem() {
 //添加坐标轴
 const DEFAULT_AXIS_LENGTH = 10000000.0;
 viewerRef.value.scene.primitives.add(
   new DebugModelMatrixPrimitive({
     length: DEFAULT_AXIS_LENGTH, //坐标轴的长度,单位是米。默认值为10000000.0
     width: 10.0, //坐标轴的宽度,单位是像素,默认值为2.0
   })
 );
 const LabelHeight = DEFAULT_AXIS_LENGTH * 1.02;
 //添加原点文字
 // addCoordinateLabel(Cartesian3.ZERO, "原点");
 const ZERO_OFFSET = -0.03 * DEFAULT_AXIS_LENGTH;
 const zeroLabel = createLabel(
   new Cartesian3(ZERO_OFFSET, ZERO_OFFSET, ZERO_OFFSET),
   "原点"
 );
 viewerRef.value.entities.add(zeroLabel);
 //添加坐标轴x文字标签
 const xLabel = createLabel(new Cartesian3(LabelHeight, 0.0, 0.0), "x");
 viewerRef.value.entities.add(xLabel);
 //添加坐标轴y文字标签
 const yLabel = createLabel(new Cartesian3(0.0, LabelHeight, 0.0), "y");
 viewerRef.value.entities.add(yLabel);
 //添加坐标轴z文字标签
 const zLabel = createLabel(new Cartesian3(0.0, 0.0, LabelHeight), "z");
 viewerRef.value.entities.add(zLabel);
 //绘制赤道线,即0度纬线
 const equator = createParallel(0, Color.BLUE);
 viewerRef.value.entities.add(equator);
 //添加赤道线文字标签
 const equatorLabel = createLabel(
   Cartesian3.fromDegrees(45.0, 0.0, 300000.0),
   "赤道"
 );
 viewerRef.value.entities.add(equatorLabel);
 //绘制本初子午线,即0度经线
 const primeMeridian = createMeridian(0, Color.RED);
 viewerRef.value.entities.add(primeMeridian);
 //添加本初子午线文字标签
 const primeMeridianLabel = createLabel(
   Cartesian3.fromDegrees(0.0, 20.0, 300000.0),
   "本初子午线"
 );
 viewerRef.value.entities.add(primeMeridianLabel);
 //添加90度经线
 const meridian90 = createMeridian(90, Color.YELLOW);
 viewerRef.value.entities.add(meridian90);
 //添加90度经线
 const meridian90Label = createLabel(Cartesian3.fromDegrees(90.0, 20.0, 300000.0),
   "90度经线");
 viewerRef.value.entities.add(meridian90Label);
}

3. 对比 WGS84 坐标系

与三维笛卡尔坐标系相比:

  1. WGS84 坐标系的坐标原点为地球质心,因此它被称为 地心坐标系 (CGCS 2000也是地心坐标系),而三维笛卡尔坐标系是以椭球体的几何中心为原点,也叫 参心坐标系 (地心、参心坐标系详见 https://www.cnblogs.com/arxive/p/9905026.html 一文的介绍 );
  2. 三维笛卡尔坐标系以 OXYZ 来表示,单位为 ;而WGS84坐标系则使用经度、纬度和高程来表示,经、纬度单位为 ,高程为
  3. 在 Cesium 中,我们常用 Cesium.Cartesian3(x,y,z) 来表示三维笛卡尔坐标系坐标;而使用 Cesium.Cartographic(longitude,latitude,height)






请到「今天看啥」查看全文