参考了网上资料
核心就是 cesium 计算的地理数据用弧度坐标系表示(很多公式计算出来的是弧度结果),我们采集的数据是经纬度表示的(即我们正常的经纬度),围绕着cesium球体展示的用笛卡尔坐标系计算的其方位的(各种附着物的摆放位置和方向)!
cesium 最直接的核心就是 经纬度可以转弧度地理坐标,弧度地理坐标可转笛卡尔坐标,笛卡尔坐标可转屏幕坐标或者二维的笛卡尔坐标,反之,也可以转化回去!
经纬度坐标
弧度坐标
笛卡尔坐标
1.经纬度转换为世界坐标(即所谓的笛卡尔坐标系)
第一种方式:直接转换:
Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
第二种方式:先转换成弧度再转换
var ellipsoid = viewer.scene.globe.ellipsoid;
var cartographic = Cesium.Cartographic.fromDegrees(lng,lat,alt);
var cartesian3 = ellipsoid.cartographicToCartesian(cartographic);
2.世界坐标(即所谓的笛卡尔坐标系)转换为经纬度
var ellipsoid = viewer.scene.globe.ellipsoid;
var cartesian3 = new Cesium.cartesian3(x,y,z);
var cartographic = ellipsoid.cartesianToCartographic(cartesian3);
var lat = Cesium.Math.toDegrees(cartograhphic.latitude);
var lng = Cesium.Math.toDegrees(cartograhpinc.longitude);
var alt = cartographic.height;
3.弧度和经纬度之间的相互转换
经纬度转弧度:
Cesium.CesiumMath.toRadians(degrees)
弧度转经纬度:
Cesium.CesiumMath.toDegrees(radians)
4.屏幕坐标和世界坐标(即所谓的笛卡尔坐标系)相互转换
屏幕转世界坐标:
var pick1= new Cesium.Cartesian2(0,0);
var cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(pick1),viewer.scene);
注意这里屏幕坐标一定要在球上,否则生成出的cartesian对象是undefined
世界坐标转屏幕坐标
Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, Cartesian3);
结果是Cartesian2对象,取出X,Y即为屏幕坐标。
//世界坐标-->屏幕坐标(窗口坐标)
function cartesianToPick() {
var x = -2735245.093986791;
var y = 5125869.0825061;
var z = 2622627.7980361506;
var cartesian3 = new Cesium.Cartesian3(x, y, z);
var pick = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3);
console.log("世界坐标:"+x+","+y+","+z);
console.log("世界坐标-->屏幕坐标");
console.log("屏幕坐标::"+pick);
}
//屏幕坐标-->世界坐标
function pickToCartesian(){
var pick= new Cesium.Cartesian2(252,377);
var cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(pick), viewer.scene);
console.log("屏幕坐标::"+pick);
console.log("屏幕坐标-->世界坐标:");
console.log("世界坐标:"+cartesian);
}