cesium从入门到进阶(一):坐标系与坐标系转换

目录

一、坐标系

1、屏幕坐标系(像素)

1.1 二维笛卡尔平面坐标Cartesian2

1.2 三维笛卡尔空间坐标(世界坐标)Cartesian3

2、地理坐标系

2.1 地理坐标系(弧度)Cartographic

2.2 地理坐标系(经纬度)WGS84

二、坐标系转换

1、WGS84(经纬度)与笛卡尔坐标(Cartesian3)互转

1.1 WGS84转Cartesian3

1.2 Cartesian3转WGS84

2 、Cartesian2屏幕坐标与Cartesian3世界坐标互换

2.1 Cartesian2转椭球面迪卡尔坐标,不包含地形、模型等的坐标

2.2 Cartesian2转场景坐标,包含地形和模型等的坐标

2.3 Cartesian2转地表笛卡尔空间坐标

2.4 Cartesian3转Cartesian2

3、角度经纬度与弧度经纬度互换


        Cesium中常用的坐标有两种WGS84地理坐标系笛卡尔空间坐标系,其中,WGS84地理坐标系包括 WGS84经纬度坐标系(没有实际的对象)和 WGS84弧度坐标系(Cartographic);
笛卡尔空间坐标系包括 笛卡尔空间直角坐标系(Cartesian3)、平面坐标系(Cartesian2),4D笛卡尔坐标系(Cartesian4)。简单的说就说屏幕坐标系地理坐标(弧度)地理坐标(经纬度)这些。

一、坐标系

1、屏幕坐标系(像素)

1.1 二维笛卡尔平面坐标Cartesian2

  • 介绍:  屏幕左上角为原点(0,0),单位为像素值,屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正。

 

  • 获取

                (1)通过鼠标点击直接获取的坐标就是屏幕坐标了,单位是像素值;

                (2)通过new Cesium.Cartesian2(x, y)创建

  •  

1.2 三维笛卡尔空间坐标(世界坐标)Cartesian3

  • 作用:用来做空间位置的变化如平移、旋转和缩放等等
  • 获取

        (1)通过new Cesium.Cartesian3(x, y, z)创建

  •  

2、地理坐标系

2.1 地理坐标系(弧度)Cartographic

  • 作用:Cesium中的地理坐标单位默认是弧度制,用Cartographic变量表示。
  • 获取:通过new Cesium.Cartographic(longitude, latitude, height)创建,其中这里的参数是用弧度表示的经纬度
new Cesium.Cartographic(longitude, latitude, height)   
 
注:这里的经纬度是用弧度表示的,经纬度其实就是角度。弧度即角度对应弧长是半径的倍数。
角度转弧度: π / 180 × 角度 
弧度变角度: 180 / π × 弧度 

2.2 地理坐标系(经纬度)WGS84

  • 作用:Cesuim中没有具体的经纬度对象,要得到经纬度首先需要计算为弧度,再进行转换
  • 获取:
// 经纬度转弧度
Cesium.Math.toRadians(degrees)
// 弧度转经纬度
Cesium.Math.toDegrees(radians)

二、坐标系转换

1、WGS84(经纬度)与笛卡尔坐标(Cartesian3)互转

1.1 WGS84转Cartesian3

方法一:直接通过经纬度转换

// 角度制与笛卡尔转换
// 格式:[113.21, 25.61, 100.0],高度默认为0,可以不写
let cartesian3 = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// 格式:[113.21, 25.61, 113.54, 25.24],不带高度格式的数组
let cartesian3s = Cesium.Cartesian3.fromDegreesArray(coordinates);
// 格式:[113.21, 25.61, 100.0, 113.54, 25.24, 200.0],带高度格式的数组
let cartesian3s = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);

// 弧度制也类似,使用Cesium.Cartesian3.fromRadians, Cesium.Cartesian3.fromRadiansArray, Cesium.Cartesian3.fromRadiansArrayHeights

方法二:使用椭球体转换

let position = Cesium.Cartographic.fromDegrees(lon, lat, height);
// 单个坐标
let cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
// 多个坐标
let cartesian3s = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(positions);

1.2 Cartesian3转WGS84

方法一:直接转换

注意:直接转换得到的是WGS84弧度制的经纬度坐标,可将其再转换为角度制

 // 3.笛卡尔空间直角坐标系转为地理坐标(弧度制)
 // var cartographic = Cesium.Cartographic.fromCartesian(cartesian3); // 方法1
 var cartographic = ellipsoid.cartesianToCartographic(cartesian3); // 方法2
 // 4.地理坐标(弧度制)转为经纬度坐标
 var lat = Cesium.Math.toDegrees(cartographic.latitude);
 var lng = Cesium.Math.toDegrees(cartographic.longitude);
 var height = cartographic.height;

方法二:通过椭球体转换

// 单个坐标
let cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
// 多个坐标
let cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographic(cartesain3Array);

2 、Cartesian2屏幕坐标与Cartesian3世界坐标互换

2.1 Cartesian2转椭球面迪卡尔坐标,不包含地形、模型等的坐标

Cesium中的Camera提供了pickEllipsoid方法:

let cartesain3 = viewer.scene.camera.pickEllipsoid(cartesian2);

2.2 Cartesian2转场景坐标,包含地形和模型等的坐标

使用Scene类中的pickPosition方法实现。

let cartesian3 = viewer.scene.pickPosition(cartesian2);

2.3 Cartesian2转地表笛卡尔空间坐标

通过相机与屏幕点位连线来求取坐标。使用Scene类中globe属性中的pick方法:

let ray = viewer.camera.getPickRay(cartesian2);
let cartesian3 = viewer.scene.globe.pick(ray,viewer.scene);

2.4 Cartesian3转Cartesian2

let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3);

3、角度经纬度与弧度经纬度互换

经纬度转弧度:
Cesium.CesiumMath.toRadians(degrees) 
弧度转经纬度:
Cesium.CesiumMath.toDegrees(radians) 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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坐标系中的位置向量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值