Cesium是一款用于构建地球上3D地图的开源JavaScript库。它采用WebGL技术,能够在不同的浏览器和平台上展示高性能和高质量的3D地图。作为一个3D地图API,不论是在定位、导航还是数据可视化方面,Cesium均非常优秀。本文将全面介绍Cesium坐标系,包括坐标系转换、CGCS2000坐标系、笛卡尔坐标系、模型坐标系、局部坐标系等。
一、Cesium坐标系转换
Cesium中的坐标系转换是很重要的。在Cesium中,通过viewer.scene.globe.ellipsoid.cartesianToCartographic(position)将笛卡尔坐标系的position转换成经纬度信息,便于进行地理信息的处理和可视化。相反地,通过viewer.scene.globe.ellipsoid.cartographicToCartesian(cartographic)可以将经纬度转换成笛卡尔坐标系。
//笛卡尔坐标系转经纬度信息
var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var cartographic = Cesium.Cartographic.fromCartesian(position);
var longitudeStr = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5);
var latitudeStr = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5);
二、Cesium坐标系墨卡托
在使用Cesium进行地图开发时,可通过坐标系墨卡托进行横向距离的计算。Cesium提供两种墨卡托投影方式,一种是Web墨卡托投影,一种是标准墨卡托投影。它们的区别在于标准墨卡托投影比Web墨卡托投影偏右。Web墨卡托进行横向距离的计算公式为:
function getWebMeratorDist(start, end) {
var dlat = Cesium.Math.toRadians(end.latitude - start.latitude);
var dlon = Cesium.Math.toRadians(end.longitude - start.longitude);
var boundary = Cesium.Math.EPSILON12;
if (Cesium.Math.equalsEpsilon(Math.abs(dlat), boundary, 0) && Cesium.Math.equalsEpsilon(Math.abs(dlon), boundary, 0)) {
return 0;
}
var a = 6378137.0;
var k = 1.0;
if (start.latitude !== 0.0 && (Math.abs(start.latitude) > boundary)) {
var b = a * (1.0 - 1.0 / 298.257223563) / Math.sqrt(1.0 - Math.pow(0.0818191908425, 2) * Math.pow(Math.sin(Cesium.Math.toRadians(start.latitude)), 2));
k = Math.cos(Cesium.Math.toRadians(start.latitude)) * (a + b) / a;
}
return Math.sqrt(Math.pow(k * dlat, 2) + Math.pow(k * Math.cos(Cesium.Math.toRadians(end.latitude)) * dlon, 2));
}
三、Cesium坐标系说明
Cesium使用的坐标系采用的是WGS84坐标系。这是一种基于椭球的坐标系,主要用于地球测量领域。在Cesium中,Ellipsoid类表示一个三维的椭球体,Ellipsoid.WGS84即为WGS84坐标系。
var ellipsoid = Cesium.Ellipsoid.WGS84;
四、Cesium坐标系CGCS2000
CGCS2000是中国大地坐标系2000,也是国际标准。Cesium中也提供了CGCS2000坐标系的支持。我们可以通过在 viewer.camera.lookAtTransform(mapMatrix)修改当前摄像机的姿态和视图来完成CGCS2000坐标系的展示。
var mapMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center, ellipsoid);
viewer.camera.lookAtTransform(mapMatrix, new Cesium.Cartesian3(0.0, 0.0, height));
五、Cesium 2000坐标系
Cesium 2000坐标系是一种Cesium自定义的坐标系,在场景中默认使用。与WGS84坐标系非常接近。我们可以使用 Cesium.Transforms.preloadIcrfFixed() 来预先加载并计算 ICRF 到 固定坐标系 的变换矩阵。
Cesium.Transforms.preloadIcrfFixed();
六、Cesium笛卡尔坐标系
Cesium中采用笛卡尔坐标系来描述位置、速度和加速度等,即{x,y,z}坐标。我们可以通过Cesium.Cartesian3类来初始化笛卡尔坐标系的位置坐标,将一个经纬度转换成笛卡尔坐标系的位置,或是在笛卡尔坐标系中进行2D和3D点位操作。
var position = new Cesium.Cartesian3(x, y, z); //初始化笛卡尔坐标系的位置坐标
var cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); //将经纬度转换成笛卡尔坐标系的位置
七、Cesium模型坐标系
在Cesium中,模型坐标系是一种相对于父级的坐标系,可以将模型放置在场景中的特定位置和角度。我们可以使用Cesium.TransformationMatrix类来创建一个矩阵变换,使一个对象相对于另一个对象进行旋转、平移和缩放。
var hh = Cesium.Transforms.headingPitchRollQuaternion(cartesian3, new Cesium.HeadingPitchRoll(heading, pitch, roll)); //旋转变换
八、Cesium局部坐标系
局部坐标系是相对于另一个对象或父级的坐标系。在Cesium中,我们可以通过Cesium.ReferenceFrame类来创建一个局部坐标系。该局部坐标系的原点是相对于父级的位置,可以在场景中的任意地方移动、旋转和缩放。
var referenceFrame = new Cesium.ReferenceFrame({
origin: position,
axes: [new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(0.0, 1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, 1.0)]
});
九、Cesium默认坐标系
Cesium中默认的坐标系是俯视图的笛卡尔坐标系,即z轴垂直于地球表面。这种坐标系可以规避使得计算坐标系的方向向量时造成的所有复杂性,也比其它坐标系更容易被理解和使用。 以上就是Cesium坐标系的详细介绍。无论从坐标系转换、墨卡托投影、CGCS2000坐标系,到笛卡尔坐标系、模型坐标系、局部坐标系和默认坐标系,我们都详细讲解了相关知识点,并且提供了对应的代码示例。希望能对大家了解Cesium坐标系有所帮助。