C1——entity的坐标转换

描述:cesium或者超图里面,通常获取到的图层或对象的坐标都是世界坐标如:{x: -1590***.**352927, y: 53205**.**479968, z: 313**.***9036}。转换为我们常见的84 坐标(106.******9027,29.**213142, 0)

示例:这里以图层为例,其他都是类似的

let ellipsoid=viewer.scene.globe.ellipsoid;
let cartesian3 = viewer.scene.layers.find("体南段")._position;
// let cartesian3= new Cesium.Cartesian3( position.x, position.y, position.z);
let cartographic=ellipsoid.cartesianToCartographic(cartesian3);
console.log( cartographic );
let lon = Cesium.Math.toDegrees(cartographic.longitude);
let lat = Cesium.Math.toDegrees(cartographic.latitude);
let height = cartographic.height;
console.log( lon,lat,height );

结果:

上面分别为:世界坐标;弧度坐标;84坐标

其他笔记:

Pick----屏幕坐标   
Cartesian----世界坐标  笛卡尔坐标
cartographic-----地理坐标(弧度)WGS84
Point----经纬度坐标 WGS84
Cartesian----世界坐标  笛卡尔坐标
  const longitude = Cesium.Math.toRadians( feature.getProperty("Longitude") );
  const latitude = Cesium.Math.toRadians( feature.getProperty("Latitude"));
  const height = feature.getProperty("Height");
改变高度:经纬度=》弧度=》笛卡尔 【水平平移类似】
//经纬度坐标转换笛卡尔坐标
//Cartesian3.fromDegrees =  a {x: -2847383.0422115843, y: 4659501.404998853, z: 3284729.700788161}
var fromDegrees = Cesium.Cartesian3.fromDegrees(daTAs.longitude, daTAs.latitude, daTAs.height);
var fromDegrees1 = Cesium.Cartesian3.fromDegrees(daTAs.longitude- 0.0005, daTAs.latitude- 0.0005, daTAs.height);
//笛卡尔坐标转换成4X4的矩阵,Transfroms。第四行是笛卡尔坐标,前三行是旋转参数。
var eastNorthUpToFixedFrame = Cesium.Transforms.eastNorthUpToFixedFrame(fromDegrees);
//角度转换为弧度
//函数3:Math.toRadians =  0.5235987755982988
var toRadians = Cesium.Math.toRadians(daTAs.heading);
//弧度转换成3X3的矩阵,
var fromRotationZ = Cesium.Matrix3.fromRotationZ(toRadians);
//3X3矩阵转换成4X4矩阵,前三行一样,第四行为(0 0 0 1)
var fromRotationTranslation =Cesium.Matrix4.fromRotationTranslation(fromRotationZ);
//计算两个矩阵的乘积Cesium.Matrix4.multiply(a, b, a),a = a*b;
var multiply = Cesium.Matrix4.multiply(eastNorthUpToFixedFrame, fromRotationTranslation, eastNorthUpToFixedFrame);
//笛卡尔坐标转为经纬度坐标(longitude, latitude, height),用经纬度用弧度
//fromCartesian.longitude = 2.1193316597629988
var fromCartesian = Cesium.Cartographic.fromCartesian(fromDegrees);
//函数8:弧度转为角度
//Math.toDegrees =  121.42875949287559
var toDegrees = Cesium.Math.toDegrees(fromCartesian.longitude);
//获得4X4矩阵左上角的3X3旋转矩阵
/*Matrix4.getRotation =  {
  0: -0.6039169322494417, 1: -0.6725816358851927, 2: 0.4276894691390252, 
  3: 0.6605635299913337, 4: -0.12206955725374125, 5: 0.7407798904109532, 
  6: -0.44602708638356436, 7: 0.7298855843636546, 8: 0.5180027721453959}*/
var getRotation = Cesium.Matrix4.getRotation(multiply, new Cesium.Matrix3());
//Matrix3.multiplyByVector计算3X3矩阵和列向量的乘积
//rotpos = new Cesium.Cartesian3 =  a {x: 50, y: 0, z: 0}
var rotpos = new Cesium.Cartesian3(daTAs.range, 0.0, 0.0);
//multiplyByVector =  a {x: -30.19584661247208, y: -33.62908179425963, z: 21.384473456951262}
var multiplyByVector = Cesium.Matrix3.multiplyByVector(getRotation, rotpos, new Cesium.Cartesian3());
//Cesium.Cartesian3.add(left, right, result),两个矩阵相加
//fromDegrees =  a {x: -2847383.0422115843, y: 4659501.404998853, z: 3284729.700788161}
//addrotpos =  a {x: -2847413.238058197, y: 4659467.775917059, z: 3284751.085261618}
var addrotpos = Cesium.Cartesian3.add(fromDegrees, multiplyByVector, new Cesium.Cartesian3());
//Cesium.Matrix3.getColumn(matrix, index, result),获取矩阵指定行的数据
//xaxis = getRotation[0] = a {x: -0.6039169322494417, y: -0.6725816358851927, z: 0.4276894691390252}
var xaxis = Cesium.Matrix3.getColumn(getRotation, 0, new Cesium.Cartesian3());
var yaxis = Cesium.Matrix3.getColumn(getRotation, 1, new Cesium.Cartesian3());
var zaxis = Cesium.Matrix3.getColumn(getRotation, 2, new Cesium.Cartesian3());
//Cesium.Cartesian3.subtract(left, right, result),两个矩阵相减
//subtract =  a {x: -25.058249244466424, y: -23.75879775546491, z: 11.900636777747422}
var subtract = Cesium.Cartesian3.subtract(addrotpos, fromDegrees1 , new Cesium.Cartesian3());
//Cesium.Cartesian3.cross(left, right, result) ,计算两个坐标的叉(外)积【叉乘的意义就是通过两个向量来确定一个新的向量,该向量与前两个向量都垂直】
//subtract X zaxis =  a {x: -20.99322632899841, y: 7.672236225656107, z: -28.886722231773863}
//zaxis X dir01 =  a {x: -25.05824176993303, y: -23.75880998690632, z: 11.900628097043635}
var dir01 = Cesium.Cartesian3.cross(subtract, zaxis, new Cesium.Cartesian3());
var dir02 = Cesium.Cartesian3.cross(zaxis, dir01, new Cesium.Cartesian3());
//Cesium.Cartesian3.normalize(cartesian, result),标准化
//dir02normalize =  a {x: -0.6039169322500869, y: -0.6725816358850737, z: 0.42768946913830164}
var dir02normalize = Cesium.Cartesian3.normalize(dir02, new Cesium.Cartesian3());
//Cesium.Cartesian3.angleBetween(left, right),两个坐标的夹角,弧度表示
//angleBetween(xaxis, dir02normalize) =  0.13281132473930984
var angleBetween = Cesium.Cartesian3.angleBetween(xaxis, dir02normalize);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值