Cesium中有两种坐标系,WGS84地理坐标系和笛卡尔空间坐标系。
WGS84地理坐标系包括:WGS84经纬度坐标系(Cesium没有实际的对象表示)、 WGS84弧度坐标系(Cartographic);
笛卡尔空间坐标系包括:平面直角坐标系(Cartesian2)、笛卡尔空间直角坐标系(Cartesian3)、4D笛卡尔坐标系(Cartesian4)。
WGS84坐标系
Cesium中没有描述WGS84经纬度坐标的对象,都是以弧度的方式来表示的也就是,Cartographic类:new Cesium.Cartographic(longitude, latitude, height),这里的参数也叫longitude、latitude,就是经度和纬度,以弧度为单位。
笛卡尔空间坐标系
平面直角坐标系(Cartesian2)
平面直角坐标系,是二维笛卡儿坐标系。构造函数是new Cesium.Cartesian2(x, y)。具体是位置距离canvas左上角的像素值。屏幕左上角为原点(0.0),屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正。Cesium中使用Cartesian2来描述屏幕坐标系。
笛卡尔空间直角坐标系(Cartesian3)
笛卡尔空间坐标的原点就是椭球的中心,我们在计算机上进行绘图时,不方便使用经纬度直接进行绘图,比如做一些空间位置变换如平移旋转缩放等等,一般会将坐标系转换为笛卡尔坐标系。构造函数是new Cesium.Cartesian3(x,y,z),这里的Cartesian3里面的下x,y,z即为笛卡儿坐标系三个坐标轴方向上的分量。以空间中O点为原点,建立三条两两垂直的数轴;X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标),建立了空间直角坐标系0—XYZ。
坐标转换
经纬度和弧度转换
let radians=Cesium.Math.toRadians(degrees);//经纬度转弧度
let degrees=Cesium.Math.toDegrees(radians);//弧度转经纬度
经纬度坐标和弧度坐标的转换
//经纬度转弧度
//方法一:
let longitude = Cesium.Math.toRadians(longitude1); //其中 longitude1为角度
let latitude= Cesium.Math.toRadians(latitude1); //其中 latitude1为角度
let cartographic = new Cesium.Cartographic(longitude, latitude, height);//其中,longitude和latitude为弧度
//方法二:
let cartographic= Cesium.Cartographic.fromDegrees(longitude1, latitude1, height);//其中,longitude1和latitude1为角度
//方法三:
let cartographic= Cesium.Cartographic.fromRadians(longitude, latitude, height);//其中,longitude和latitude为弧度
弧度坐标和笛卡尔空间直角坐标转换
//弧度转笛卡尔
let position = Cesium.Cartesian3.fromRadians(longitude, latitude, height);//其中,高度默认值为0,可以不用填写;longitude和latitude为弧度
let positions = Cesium.Cartesian3.fromRadiansArray(coordinates);//其中,coordinates格式为不带高度的数组。
let positions = Cesium.Cartesian3.fromRadiansArrayHeights(coordinates);//coordinates格式为带有高度的数组。
//笛卡尔转弧度
let cartographic= Cesium.Cartographic.fromCartesian(cartesian3);
经纬度和笛卡尔空间直角坐标转换
//经纬度转笛卡尔
let position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);//其中,高度默认值为0,可以不用填写;longitude和latitude为角度
let positions = Cesium.Cartesian3.fromDegreesArray(coordinates);//其中,coordinates格式为不带高度的数组。例如:[-115.0, 37.0, -107.0, 33.0]
let positions = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带有高度的数组。例如:[-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]
//笛卡尔转经纬度,先转弧度坐标,再转经纬
let cartographic= Cesium.Cartographic.fromCartesian(cartesian3);
let longitude = Cesium.Math.toRadians(cartographic.longitude);
let latitude= Cesium.Math.toRadians(cartographic.latitude);
平面坐标和笛卡尔空间直角坐标转换
//平面坐标转笛卡尔空间直角坐标
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (e) {
//方法一:
//e.position为屏幕坐标,pickEllipsoid返回笛卡尔坐标
let position=
viewer.scene.camera.pickEllipsoid(e.position,viewer.scene.globe.ellipsoid);//第二个参数不写默认为Ellipsoid.WGS84
//方法二:
let ray = viewer.camera.getPickRay(e.position);//getPickRay返回Ray射线
let position = viewer.scene.globe.pick(ray, viewer.scene);//查找射线与地球表面之间的交点
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
//笛卡尔空间直角坐标转平面坐标
let windowPostion = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3);