一、坐标系统
cesium中坐标系统分为地理坐标、世界坐标(X,Y,Z)、屏幕坐标三种。
通常使用地理坐标来进行位置表达,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放,屏幕坐标常用来做用户交互等,三者之间相互转换。
(1)默认使用WGS84作为空间参考,地理坐标又分为两种经纬度和弧度两种表达方式
(2)采用右手系的笛卡尔空间直角坐标系,也叫世界坐标、原点就是椭球的中心。这里的Cartesian3,有点类似于三维系统中的Point3D对象,new Cesium.Cartesian3(x, y, z)
(3)屏幕坐标即屏幕显示的二维坐标,左上角为坐标原点,鼠标点击即可获取,new Cesium.Cartesian2(x, y)
二、坐标转换
1.角度和弧度互转
var radians=Cesium.Math.toRadians(degrees);//经纬度转弧度
var degrees=Cesium.Math.toDegrees(radians);//弧度转经纬度
2.地理经纬度转地理弧度
//方法一:
var longitude = Cesium.Math.toRadians(lng); //其中 lng为经度
var latitude= Cesium.Math.toRadians(lat); //其中 lat为纬度
var cartographic = new Cesium.Cartographic(longitude, latitude, height);
//方法二:
var cartographic= Cesium.Cartographic.fromDegrees(lng, lat, height);//其中,lng和lat为经纬度
//方法三:
var cartographic= Cesium.Cartographic.fromRadians(longitude, latitude, height);//其中,longitude和latitude为弧度
3.经纬度转世界坐标
lnglatToCartesian(lng,lat,height){
//直接转换
var cartesian3 = Cesium.Cartesian3.fromDegrees(lng, lat, height);
//先转弧度后转笛卡尔
//var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); //单位:度,度,米
//var ellipsoid=viewer.scene.globe.ellipsoid;
//var cartesian3 = ellipsoid.cartographicToCartesian(cartographic);
return cartesian3
}
4.世界坐标转经纬度
Cesium不支持笛卡尔坐标直接转经纬度,需要先转换为弧度,再由弧度转化为经纬度
cart3Tolnglat(cartesian3){
var ellipsoid=this._viewer.scene.globe.ellipsoid;
const cartograhphic=ellipsoid.cartesianToCartographic(cartesian3);
var lat=Cesium.Math.toDegrees(cartograhphic.latitude);
var lng=Cesium.Math.toDegrees(cartograhphic.longitude);
var height=cartographic.height
return [lng,lat,height];
},
5.世界坐标转屏幕坐标
var cartesian2= Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3)
6.屏幕坐标转世界坐标
坐标获取
var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
handler.setInputAction(function (event) {
//event.position为屏幕坐标
console.log(event.position);
//获取包含了地形、倾斜摄影表面、模型的世界坐标
//解决在没有3dTile模型下的笛卡尔坐标不准问题,viewer.scene.globe.depthTestAgainstTerrain = true; //默认为false
var pickedPosition = viewer.scene.pickPosition(event.position);
if (Cesium.defined(pickedPosition)) {
console.log('1',pickedPosition);
}
//获取地球表面的世界坐标,包含地形,不包含其他模型
//Create a ray from the camera position through the pixel at windowPosition in world coordinates.
var ray = viewer.camera.getPickRay(event.position);
//Find an intersection between a ray and the globe surface that was rendered. The ray must be given in world coordinates.
var position2 = viewer.scene.globe.pick(ray, viewer.scene);
console.log('2',position2);
//获取参考椭球的世界坐标
var position3 = viewer.scene.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
console.log('3',position3);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);