【Cesium】Cesium坐标转换

Cesium中的坐标系:

1、平面坐标系(Cartesian2);

2、笛卡尔空间直角坐标系(Cartesian3);

3、Cartesian4(unknown,在应用中几乎用不到)

4、Cartographic(地理坐标系下经纬度的弧度表示),通常情况下通过它和WGS84坐标系之间互转。

 

2.1.1世界坐标

以椭球中心为原点的空间直角坐标系中的一个点的坐标。Cesium中用Cartesian3变量表示,笛卡尔空间直角坐标系,用new Cesium.Cartesian3(x, y, z)创建。

2.1.2 地理坐标

就是测绘中的地理经纬度坐标,地理坐标系,坐标原点在椭球的质心。

经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。东正西负。

纬度 :参考椭球面上某点的法线与赤道平面的夹角。北正南负。

Cesuim中没有具体的经纬度对象,要得到经纬度首先需要计算为弧度,再进行转换。

2.1.3  弧度

Cartographic变量表示。

new Cesium.Cartographic(longitude, latitude, height)。是用弧度表示的经纬度,这里的参数也叫做longitude,latitude,即经度和纬度。弧度即角度对应弧长是半径的倍数。

角度转弧度 π/180×角度 ;
弧度变角度 180/π×弧度。

2.2 坐标转换

Cesium其实是一个封装好的WebGL库,当然这里面就牵扯到好几套坐标问题:屏幕坐标、三维空间坐标、投影坐标。坐标转换肯定是我们在开发任何地理信息系统中经常会碰到的问题,也比较复杂。

“平面坐标系” 和“笛卡尔空间直角坐标系”和“Cartographic”之间的相互转换思路如下所示。

坐标的定义:

1:Cartesian2-----new Cesium.Cartesian2(x, y)

2:Cartesian3---- new Cesium.Cartesian3(x, y, z)

3:Cartographic----new Cesium.Cartographic(longitude, latitude, height) 注:经纬度为弧度单位

转换:

Cartesian3→ Cartesian2,        Cesium.Cartesian2.fromCartesian3(cartesian, result)→ Cartesian2

经纬度坐标(WGS84)→ Cartesian3,    Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result) → Cartesian3

弧度坐标 → Cartesian3,         Cesium.Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result) → Cartesian3

Cartesian3→ Cartographic,        Cesium.Cartographic.fromCartesian(cartesian, ellipsoid, result) → Cartographic

经纬度坐标(WGS84)→ Cartographic,   Cesium.Cartographic.fromDegrees(longitude, latitude, height, result) → Cartographic

 

单位:
经纬度坐标和弧度坐标也可以通过Cesium.Math来转换。

Cesium.CesiumMath.toDegrees(radians) → Number

Cesium.CesiumMath.toRadians(degrees) → Number

 

2.2.1 坐标系

new Cesium.Cartesian2(1,1) //表示一个二维笛卡尔坐标系,也就是直角坐标系(屏幕坐标系)
new Cesium.Cartesian3(1,1,1) //表示一个三维笛卡尔坐标系,也是直角坐标系(就是真实世界的坐标系)

2.2.2 二维屏幕坐标系到三维坐标系的转换

var pick1= scene.globe.pick(viewer.camera.getPickRay(pt1), scene) //其中pt1为一个二维屏幕坐标。

2.2.3 三维坐标到地理坐标的转换

var geoPt1= scene.globe.ellipsoid.cartesianToCartographic(pick1) //其中pick1是一个Cesium.Cartesian3对象。

2.2.4 地理坐标到经纬度坐标的转换

var point1=[geoPt1.longitude / Math.PI * 180,geoPt1.latitude / Math.PI * 180]; //其中geoPt1是一个地理坐标。

2.2.5 经纬度坐标转地理坐标(弧度)

var cartographic = Cesium.Cartographic.fromDegree(point) //point是经纬度值
var coord_wgs84 = Cesium.Cartographic.fromDegrees(lng, lat, alt);//单位:度,度,米

2.2.6 经纬度坐标转世界坐标

var cartesian = Cesium.Cartesian3.fromDegree(point)

2.2.7 计算两个三维坐标系之间的距离

var d = Cesium.Cartesian3.distance(
    new Cesium.Cartesian3(pick1.x, pick1.y, pick1.z), 
    new Cesium.Cartesian3(pick3.x, pick3.y, pick3.z)
); //pick1、pick3都是三维坐标系

 

转换到笛卡尔坐标系后就能运用计算机图形学中的仿射变换知识进行空间位置变换如平移旋转缩放。cesium.js为我们提供了很有用的变换工具类,
Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3x3矩阵,用于描述旋转变换)Cesium.Matrix4(4x4矩阵,用于描述旋转
加平移变换),Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)。下面举个例子:

一个局部坐标为p1(x,y,z)的点,将它的局部坐标原点放置到loc(lng,lat,alt)上,局部坐标的z轴垂直于地表,局部坐标的y轴指向正北,
并围绕这个z轴旋转angle度,求此时p1(x,y,z)变换成全局坐标笛卡尔坐标p2(x1,y1,z1)是多少?

var rotate = Cesium.Math.toRadians(angle);//转成弧度
var quat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z, rotate); //quat为围绕这个z轴旋转d度的四元数
var rot_mat3 = Cesium.Matrix3.fromQuaternion(quat);//rot_mat3为根据四元数求得的旋转矩阵

var pt = new Cesium.Cartesian3(x, y, z);//p1的局部坐标
// m2为旋转加平移的4x4变换矩阵,这里平移为(0,0,0),故填个Cesium.Cartesian3.ZERO
var m = Cesium.Matrix4.fromRotationTranslation(rot_mat3, Cesium.Cartesian3.ZERO);
m = Cesium.Matrix4.multiplyByTranslation(m, pt);//m = m X v

//得到局部坐标原点的全局坐标
var cart3 = ellipsoid.cartographicToCartesian(Cesium.Cartographic.fromDegrees(lng, lat, alt));
//m1为局部坐标的z轴垂直于地表,局部坐标的y轴指向正北的4x4变换矩阵
var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(cart3);
m = Cesium.Matrix4.multiplyTransformation(m, m1);//m = m X m1
var p2 = Cesium.Matrix4.getTranslation(m);//根据最终变换矩阵m得到p2
 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium中,坐标转换可以使用Cesium坐标转换功能来实现。Cesium提供了几种常用的坐标系转换方法,包括经纬度(地理坐标)和笛卡尔坐标之间的转换。 要将经纬度转换为笛卡尔坐标,你可以使用Cesium.Cartesian3.fromDegrees()方法。该方法接受经度、纬度和可选的高度参数,并返回对应的笛卡尔坐标。 例如,要将经度为lon、纬度为lat、高度为height的位置转换为笛卡尔坐标,可以使用以下代码: ```javascript var cartesian = Cesium.Cartesian3.fromDegrees(lon, lat, height); ``` 同样地,如果你有一个笛卡尔坐标(x、y、z),想要将其转换为经纬度,可以使用Cesium.Cartographic.fromCartesian()方法。该方法接受一个笛卡尔坐标作为参数,并返回对应的经纬度坐标。 以下是一个将笛卡尔坐标转换为经纬度的示例: ```javascript var cartographic = Cesium.Cartographic.fromCartesian(cartesian); var longitude = Cesium.Math.toDegrees(cartographic.longitude); var latitude = Cesium.Math.toDegrees(cartographic.latitude); var height = cartographic.height; ``` 在上面的代码中,首先使用Cesium.Cartographic.fromCartesian()方法将笛卡尔坐标转换为地理坐标对象,然后使用Cesium.Math.toDegrees()方法将弧度转换为度数。最后,可以通过访问地理坐标对象的longitude、latitude和height属性来获取转换后的经纬度和高度值。 需要注意的是,Cesium还提供了其他坐标系之间的转换方法,如笛卡尔坐标和屏幕坐标之间的转换。你可以根据具体的需求选择合适的方法进行坐标转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值