文章目录
- 1.角度与弧度互转
- 2.WGS84(经纬度)与笛卡尔坐标(Cartesian3)互转
- 2.1WGS84转Cartesian3
- 2.2 Cartesian3转WGS84
- 3.屏幕坐标与笛卡尔坐标互转
- 3.1屏幕转笛卡尔(Cartesian2转Cartesian3)
- 3.2笛卡尔转屏幕(Cartesian3转Cartesian2)
- 4.椭球笛卡尔坐标与局部笛卡尔坐标
- 4.1建立转换矩阵
- 4.2局部转椭球笛卡尔
在Cesium项目开发过程中,经常需要将坐标在各个坐标系之间进行转换,以满足绘图和打印输出等需求。
1.角度与弧度互转
使用Cesium.Math
中的方法进行角度与弧度的转换,API:传送门
(1)角度转弧度
let radians = Cesium.Math.toRadians(degrees);
(2)弧度转角度
let degrees = Cesium.Math.toDegrees(radians);
2.WGS84(经纬度)与笛卡尔坐标(Cartesian3)互转
Cesium在绘图过程中需要使用笛卡尔空间直角坐标,因此需要将WGS84经纬度坐标
转换为笛卡尔坐标,才能用于绘图。
cartographic:弧度制表示的wgs84坐标系
。wgs84使用(经度,纬度,大地高)表示。
2.1WGS84转Cartesian3
(1)直接通过经纬度转换
// 角度制与笛卡尔转换
// 格式:[113.21, 25.61, 100.0],高度默认为0,可以不写
let cartesian3 = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// 格式:[113.21, 25.61, 113.54, 25.24],不带高度格式的数组
let cartesian3s = Cesium.Cartesian3.fromDegreesArray(coordinates);
// 格式:[113.21, 25.61, 100.0, 113.54, 25.24, 200.0],带高度格式的数组
let cartesian3s = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);
// 弧度制也类似,使用Cesium.Cartesian3.fromRadians, Cesium.Cartesian3.fromRadiansArray, Cesium.Cartesian3.fromRadiansArrayHeights
(2)使用椭球体转换
let position = Cesium.Cartographic.fromDegrees(lon, lat, height);
// 单个坐标
let cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
// 多个坐标
let cartesian3s = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions);
2.2 Cartesian3转WGS84
(1)直接转换
直接转换得到的是WGS84弧度制
的经纬度坐标,可将其再转换为角度制。
let cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
(2)通过椭球体转换
// 单个坐标
let cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
// 多个坐标
let cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographic(cartesain3Array);
3.屏幕坐标与笛卡尔坐标互转
3.1屏幕转笛卡尔(Cartesian2转Cartesian3)
(1)屏幕转椭球面笛卡尔坐标
,不包含地形、模型等的坐标
Cesium中的Camera
提供了pickEllipsoid
方法:传送门
let cartesain3 = viewer.scene.camera.pickEllipsoid(cartesian2);
(2)屏幕转场景坐标
,包含地形和模型等的场景空间坐标
使用Scene
类中的pickPosition
方法实现:传送门
let cartesian3 = viewer.scene.pickPosition(cartesian2);
(3)屏幕坐标转地表笛卡尔空间坐标
通过相机与屏幕点位连线来求取坐标。
使用Scene
类中globe
属性中的pick
方法:传送门
let ray = viewer.camera.getPickRay(cartesian2);
let cartesian3 = globe.pick(ray,viewer.scene);
3.2笛卡尔转屏幕(Cartesian3转Cartesian2)
Cesium提供了SceneTransforms
的wgs84ToWindowCoordinates
方法将笛卡尔坐标转换为屏幕坐标:传送门
let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, cartesian3);
4.椭球笛卡尔坐标与局部笛卡尔坐标
上文中的笛卡尔坐标系都是默认指以椭球中心为原点的空间直角坐标系
,在绘图时使用。
而在建立模型或者局部计算
时,则需要在计算时使用局部坐标
,再转换为椭球笛卡尔坐标后绘图。
4.1建立转换矩阵
使用Transforms
的eastNorthUpToFixedFrame
方法建立转换矩阵,API:传送门
则该点为局部坐标系的中心
,坐标为(0, 0, 0),x轴指向东方向,y轴指向北方向,z轴指穿过该位置的椭球曲面法线方向。
let modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(cartesian3);
4.2局部转椭球笛卡尔
基于上文建立四维转换矩阵
,使用Matrix4
中的multiplyByPoint
方法将局部坐标转换为椭球笛卡尔坐标。API参考:传送门
转换代码为:
// point:局部坐标;result:椭球笛卡尔坐标
let result = Cesium.Matrix4.multiplyByPoint(modelMatrix, point, new Cesium.Cartesian3());