Cesium中的坐标类型及转换

发布时间 2023-04-17 15:12:52作者: 中亿丰数字科技

06-Cesium中的坐标类型及转换

1、屏幕坐标

屏幕坐标是平面直角坐标系,是二维笛卡尔坐标系。Cesium中使用Cartesian2来描述屏幕坐标系构造函数是new Cesium.Cartesian2(x, y)。具体是鼠标点击位置距离canvas左上角的像素值。屏幕左上角为原点(0.0),屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正。

		let handlerPoint = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas);
        handlerPoint.setInputAction(function(event) {
            console.log(event)  //打印出的就是屏幕坐标
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

2、笛卡尔空间直角坐标

以空间中O点为原点,建立三条两两垂直的数轴;X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标),建立了空间直角坐标系0—XYZ。 笛卡儿空间直角坐标的原点就是椭球的中心。构造函数是new Cesium.Cartesian3(x,y,z),这里的Cartesian3里面的下x,y,z即为笛卡儿坐标系三个坐标轴方向上的分量。

3、地理坐标

首先将地球抽象成一个规则的逼近原始自然地球表面的椭球体,称为参考椭 球体,然后在参考椭球体上定义系列的经线 和纬线构成经纬网。需要说明的是经纬地理坐标系不是平面坐标系,因为度不是标准的长度单位,不可用其直接量测长度和面积。基于椭球体表示空间点的位置采用三个参数:大地经度、大地纬度、大地高。
大地经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。向东为正,向西为负。
大地纬度:参考椭球面上某点的法线与赤道平面的夹角。向北为正,向南为负。
大地高:指某点沿法线方向到参考椭球面的距离。
不同的椭球体大小、定位与定向决定了不同的坐标系统。
以WGS-84为例,WGS-84是为美国全球定位系统(GPS)的使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH 1984.0定义的协议地球极(CTP)方向。X轴指向BIH1984.0定义的零子午面和CTP赤道的交点。Y轴与Z轴、X轴垂直构成右手坐标系。经度范围为[-180°,180°],纬度范围为[- 90°,90°]。WGS-84是目前应用范围最为广泛的地理坐标系,通常国外通感影像均采用WGS-84。Cesium中定义Cartographic ,用new Cesium.Cartographic(longitude,latitude,height)来描述地理坐标,这里longitude、latitude都是弧度坐标值

4、经纬度坐标

经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。东正西负。
纬度:参考椭球面上某点的法线与赤道平面的夹角。北正南负。

Cesium中的坐标转换

1、经纬度(Degrees)与笛卡尔空间坐标(Cartesian3)相互转换

  • 经纬度转换为笛卡尔空间坐标
let point= Cesium.Cartesian3.fromDegrees(longitude,latitude,height) //height可以不传
  • 笛卡尔空间坐标转换为经纬度
let cartorgraphic = Cesium.Cartographic.fromCartesian(cartesian3);

2、经纬度(Cartographic)和地理坐标(Degrees)相互转换

  • 经纬度转地理坐标
let point =Cesium.Math.toRadians(degrees)
  • 地理坐标转经纬度
let point =Cesium.Math.toDegrees(radians)

3、屏幕坐标(Cartesian2)和笛卡尔空间直角坐标(Cartesian3)相互转换

  • 屏幕坐标转笛卡尔空间直角坐标

(1)包含了地形、倾斜摄影测量模型等其他三维模型的坐标

var cartesian3= viewer.scene.pickPosition(cartesian2);

(2)地形在内,但是不包括倾斜摄影测量模型等其他三维模型的坐标

var cartesian3=viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);

(3)不包含地形、倾斜摄影测量模型等其他三维模型的坐标

var cartesian3= viewer.scene.camera.pickEllipsoid(cartesian2);
  • 笛卡尔空间直角坐标转屏幕坐标
let c2=Cesium.SceneTransfroms.wgs84ToWindowCoordinates(cartesian3);