学习【Cesium】第四篇,Cesium的坐标与转换(学不会揍我)

15 篇文章 6 订阅
5 篇文章 0 订阅

Cesium坐标系

Cesium中常用的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系,我们平时常用的以经纬度来指明一个地点就是用的WGS84坐标,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放等等。其中,WGS84地理坐标系包括WGS84经纬度坐标系(没有实际的对象)和WGS84弧度坐标系(Cartographic);笛卡尔空间坐标系包括笛卡尔空间直角坐标系(Cartesian3)、平面坐标系(Cartesian2),4D笛卡尔坐标系(Cartesian4)。

WGS84坐标系(Cartographic)



World Geodetic System 1984,是为GPS全球定位 系统使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH (国际时间服务机构) 1984.0定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系。我们平常手机上的指南针显示的经纬度就是这个坐标系下当前的坐标,进度范围[-180, 180]纬度范围[-90, 90]。
 

 Cesium目前支持两种坐标系WGS84和WebMercator,但是在Cesium中没有 实际的对象来描述WGS84坐标,都是以弧度的方式来进行运用的也就是Cartographic类: new Cesium.Cartographic(longitude, latitude, height),这里的参数也叫longitude、latitude, 就是经度和纬度,计算方法:弧度= π/180x经纬度角度。

笛卡尔空间坐标系(Cartesian3)

直角坐标系也可以推广至三维空间与高维空间 (higher dimension)。在原本的二维直角坐标系,再添加一个垂直于x-轴,y-轴的坐标轴,称为z-轴。假若,这三个坐标轴满足右手定则,则可得到三维的直角坐标系。这z-轴与x-轴,y-轴相互正交于原点。在三维空间的任何一点P,可以用直角坐标(x,y,z)来表达其位置

平面坐标系(Cartesian2) 


平面坐标系也就是平面直角坐标系,是一一个二维笛卡尔坐标系,与Cartesian3相比少 了-一个z的分量, new Cesium.Cartesian2(x, y)。Cartesian2经常用来描述屏幕坐标系,如鼠标在电脑屏幕上的点击位置,返回的就是Cartesian2, 返回了鼠标点击位置的xy像素点分量。

 4D笛卡尔坐标系(Cartesian4)

在《web GL编程指南》中有描述:

 

 (按照矩阵运算规则:依次用各行*各列)新的X=1*x+Tx*1;新的Y=y+Ty;新的Z=z+Tz; 最后的的一行任然为1不改变。 加入没有红框中的那一行的话运算就不成立

 所以可以理解为Cartesian4就是三维坐标上增加一行,使用的时候看作Cartesian3即可,在实际场景运用中基本无。

坐标转换

1. 经纬度和弧度的转换:

var radians=Cesium.Math.toRadians(degrees);//经纬度转弧度

var degrees=Cesium.Math.toDegrees(radians);//弧度转经纬度

2. WGS84经纬度坐标和WGS84弧度坐标系(Cartographic)的转换:

//方法一:
var longitude = Cesium.Math.toRadians(longitude1);
//其中longitude1为可选经度,以弧度为单位
var latitude= Cesium.Math.toRadians(latitude1)
//其中latitude1为可选纬度,以弧度为单位
var cartographic = new Cesium.Cartographic(longitude,latitude,height)
//方法二:
var cartographic= Cesium.Cartographic.fromDegrees(longitude,latitude,height);
//其中,longitude和latitude为可选经、纬度,以弧度为单位
//方法三:
var cartographic= Cesium.Cartographic.fromRadians(longitude,latitude,height);
//其中,longitude和latitude为可选经、纬度,以弧度为单位

3. WGS84坐标系和笛卡尔空间直角坐标系(Cartesian3)的转换

       通过经纬度或弧度进行转换

var position = Cesium.Cartesian3.fromDegrees(longitude,latitude,height);//其中,高度默认值为0,可以不用填写;longitude和latitude为可选经、纬度,以弧度为单位
var positions = Cesium.Cartesian3.fromDegreesArray(coordinates);//其中,coordinates格式为不带高度的数组。例如:[-115.0,37.0,-107.0,33.0]
var positions = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带有高度的数组。例如:[-115.0,37.0,100000.0,-107.0,33.0,150000.0]
//同理,通过弧度转换,用法相同,具体有Cesium.Cartesian3.fromRadians,Cesium.Cartesian3.fromRadiansArray,Cesium.Cartesian3.fromRadiansArrayHeights等方法

注意:上述转换函数中最后均有一个默认参数ellipsoid(默认值为Ellipsoid.WGS84)。

4. 通过弧度进行转换

具体弧度原理可以参考上边的注意事项。

var position = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
var positions = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
var positions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([position1,position2,position3]);

5. 笛卡尔空间直角坐标系转换为WGS84

  • 直接转换
var cartographic= Cesium.Cartographic.fromCartesian(cartesian3);
// 转换得到WGS84弧度坐标系后再使用经纬度和弧度的转换,进行转换到目标值
  • 间接转换
var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
var cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray([cartesian1,cartesian2,cartesian3]);

6. 平面坐标系(Cartesian2)和笛卡尔空间直角坐标系(Cartesian3)的转换

  • 平面坐标系转笛卡尔空间直角坐标系
           这里注意的是当前的点(Cartesian2)必须在三维球上,否则返回的是undefined;通过ScreenSpaceEventHandler回调会取到的坐标都是Cartesian2
  • 屏幕坐标转场景坐标-获取倾斜摄影或模型点击处的坐标
           这里的场景坐标是包含了地形、倾斜摄影表面、模型的坐标。
           通过viewer.scene.pickPosition(movement.position)获取,根据窗口坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
     var position = viewer.scene.pickPosition(movement.position);
     console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

//  注:若屏幕坐标处没有倾斜摄影表面、模型时,获取的笛卡尔坐标不准,
//  此时要开启地形深度检测
//  viewer.scene.globe.depthTestAgainstTerrain = true;默认为false
  • 屏幕坐标转地表坐标-获取加载地形后对应的经纬度和高程
           这里是地球表面的世界坐标,包含地形,不包括模型、倾斜摄影表面。
           通过viewer.scene.globe.pick(ray,scene)获取,其中fay=viewer.camera.getPickRay(movement.position)。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
     var ray = viewer.camera.getPickRay(movement.position);
     var position = viewer.scene.globe.pick(ray, viewer.scene);
     console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
// 注:通过测试,此处得到的坐标通过转换成wgs84后,height的为该点的地形高程值。
  • 笛卡尔空间直角坐标系转平面坐标系
var cartesian2= Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3)
  • 空间位置变换
           经纬度转换到笛卡尔坐标系后就能运用计算机图形学中的仿射变换知识进行空间位置变换如平移旋转缩放。
           Cesium为我们提供了很有用的变换工具类:Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3×3矩阵,用于描述旋转变换)Cesium.Matrix4(4×4矩阵,用于描述旋转加平移变换),Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Cesium中,可以使用以下代码将J2000坐标系中的位置向量转换为笛卡尔坐标系中的位置向量: ```javascript var j2000Position = new Cesium.Cartesian3(x, y, z); // J2000坐标系中的位置向量 var j2000ToFixed = Cesium.Transforms.computeIcrfToFixedMatrix(time); // 获取J2000到固定参考系的转换矩阵 var fixedPosition = new Cesium.Cartesian3(); Cesium.Matrix3.multiplyByVector(j2000ToFixed, j2000Position, fixedPosition); // 将J2000坐标系中的位置向量转换为固定参考系中的位置向量 ``` 其中,`Cesium.Transforms.computeIcrfToFixedMatrix(time)`方法用于获取J2000到固定参考系的转换矩阵,`time`参数为转换时刻。转换矩阵是一个3x3的矩阵,表示J2000坐标系到固定参考系的旋转关系。使用`Cesium.Matrix3.multiplyByVector`方法可以将J2000坐标系中的位置向量转换为固定参考系中的位置向量。 同样,可以使用以下代码将笛卡尔坐标系中的位置向量转换为J2000坐标系中的位置向量: ```javascript var fixedPosition = new Cesium.Cartesian3(x, y, z); // 固定参考系中的位置向量 var fixedToJ2000 = Cesium.Transforms.computeFixedToIcrfMatrix(time); // 获取固定参考系到J2000的转换矩阵 var j2000Position = new Cesium.Cartesian3(); Cesium.Matrix3.multiplyByVector(fixedToJ2000, fixedPosition, j2000Position); // 将固定参考系中的位置向量转换为J2000坐标系中的位置向量 ``` 其中,`Cesium.Transforms.computeFixedToIcrfMatrix(time)`方法用于获取固定参考系到J2000的转换矩阵。同样,使用`Cesium.Matrix3.multiplyByVector`方法可以将固定参考系中的位置向量转换为J2000坐标系中的位置向量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

New_Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值