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