1.cesium坐标介绍
cesium开发中常用的坐标系统
- 屏幕坐标系统(二维)
- 笛卡尔空间直角坐标系统(WGS84)
- 地理坐标系统(经纬度坐标)
Cesium目前支持两种坐标系WGS84地理WKID=4326和WebMercator:WKID=3857,但是在Cesium中没有实际的对象来描述WGS84坐标,都是以弧度的方式来进行运用的也就是Cartographic类:
[1]屏幕坐标系统
也就是二维笛卡尔坐标系cesium中使用Cartesian2来描述屏幕坐标系统
构造函数为new Cesium.Cartesian2(x, y),屏幕左上角为原点,x右为正,y下为正
而openlayers中

[2]笛卡尔空间直角坐标系统
在GIS引擎中也称这种笛卡尔空间直角坐标系为(World Geodetic System 1984 (WGS84) 坐标系)
- 原点为参考椭球的中心
- 这个坐标系固定在地球上;当地球自转时,系统也会自转,WGS84 中定义的物体相对于地球保持固定
- x 轴指向地理坐标 (0°, 0°),y 轴指向 (90°, 0°),z 轴指向北极。赤道位于 xy 平面内。这是一个右手坐标系,因此 x × y = z,其中 x、y 和 z 是沿各自轴的单位向量
- cesium中构造函数为
new Cesium.Cartesian3(x, y, z)
注意这里不要和WGS84地理坐标或者是WGS84椭球体混淆,这只是一个三维的笛卡尔坐标系的定义(只是指定轴向,原点位置等),并不像WGS84那样包含一些椭球参数

[3]地理坐标
new Cesium.Cartographic(longitude, latitude, height)
- 经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。东正西负。
- 纬度:参考椭球面上某点的法线与赤道平面的夹角。北正南负。

注:Cartographic的经纬度是用弧度表示的,经纬度其实就是角度。弧度即角度对应弧长是半径的倍数。
所以经纬度是以弧度为单位的,高度是以米为单位。

2.cesium坐标转换
[1]角度与弧度的转换
//角度转弧度 var radians = Cesium.CesiumMath.toRadians(degrees) //弧度转角度 var degrees = Cesium.CesiumMath.toDegrees(radians)
讯享网
[2]地理坐标转Cartesian3
Cesium在绘图过程中需要使用笛卡尔空间直角坐标(如WGS84笛卡尔坐标系),因此需要将经纬度坐标转换为笛卡尔坐标,才能用于绘图。
cartographic:弧度制表示的地理坐标系。使用(经度,纬度,大地高)表示。
(1)直接经过经纬度转换
角度制的地理坐标转Cartesian3
直接转换:
讯享网Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result) ellipsoid:该Cartesian3所使用的椭球,默认为Ellipsoid.WGS84 result:存储结果的对象
Cesium.Cartesian3.fromDegreesArray(coordinates, ellipsoid, result) coordinates:经纬度数组列表,用于批量转换[经度,纬度,进度,纬度,。。。。]
讯享网let cartesian3s = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates); coordinates:[经度,纬度,高度,进度,纬度,高度]
弧度制与笛卡尔转换
弧度制也类似,使用Cesium.Cartesian3.fromRadians, Cesium.Cartesian3.fromRadiansArray, Cesium.Cartesian3.fromRadiansArrayHeights
(2)使用椭球体转换
//先转换为弧度坐标 let position = Cesium.Cartographic.fromDegrees(lon, lat, height); //获取viewer椭球体实例 let ellipsoid = viewer.scene.globe.ellipsoid; //开始转换 let cartesian3 = ellipsoid.cartographicToCartesian(position); // 多个坐标 let cartesian3s = ellipsoid.cartographicArrayToCartesianArray(positions);
[3]Cartesian3转地理坐标
(1)直接转换
讯享网//直接转换得到的是WGS84弧度制的经纬度坐标,可将其再转换为角度制。 let cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
(2)通过椭球体转换
//需要选着或创建地理坐标的椭球体参数 // 单个坐标 let cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3); // 多个坐标 let cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographic(cartesain3Array);
[4]Cartesian2与Cartesian3互转
屏幕坐标和迪卡尔空间直角坐标系的转换
(1)Cartesian2转Cartesian3
屏幕转椭球面笛卡尔坐标,不包含地形、模型等的坐标
Cesium中的Camera提供了pickEllipsoid方法:传送门
讯享网let cartesain3 = viewer.scene.camera.pickEllipsoid(cartesian2);
屏幕转场景坐标,包含地形和模型等的场景空间坐标
使用Scene类中的pickPosition方法实现:传送门
let cartesian3 = viewer.scene.pickPosition(cartesian2);
屏幕坐标转地表笛卡尔空间坐标
通过相机与屏幕点位连线来求取坐标。
使用Scene类中globe属性中的pick方法:
讯享网let ray = viewer.camera.getPickRay(cartesian2); let cartesian3 = globe.pick(ray,viewer.scene);
(2)Cartesian3转Cartesian2
Cesium提供了SceneTransforms的wgs84ToWindowCoordinates方法将笛卡尔坐标转换为屏幕坐标
let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(cartesian3);



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/38848.html