外观
坐标转换
1015字约3分钟
2024-07-01
Mars3D平台涉及的几类坐标包括:
坐标系 | 单位 | 对象的类名称 | 说明 |
---|---|---|---|
屏幕坐标 | 像素值 | Cesium.Cartesian2 | 比如鼠标拾取到的坐标值 |
笛卡尔空间直角坐标 | 米 | Cesium.Cartesian3 | 原点是地球几何中心的xyz空间坐标, Cesium原生坐标 |
地理坐标 | 弧度值 | Cesium.Cartographic | Cesium原生的地理坐标表现形式 |
地理坐标 | 角度值 | mars3d.LngLatPoint | mars3d扩展的地理坐标经纬度表现形式,并内置了转换算法 |
1 笛卡尔空间直角坐标 Cartesian3
笛卡尔空间直角坐标又称为世界坐标,Cesium中用Cartesian3变量表示,可通过new Cesium.Cartesian3(x, y, z)创建,主要是用来做空间位置的变化如平移、旋转和缩放等等,它的坐标原点在椭球的中心
- 笛卡尔坐标系原点是地球几何中心;
- xz平面是中央经线和180度经线组成的平面,其中x轴正方向指向的是中央经线,x轴负方向指向180度经线;
- y轴正方向指向东经90度经线,负方向指向西经90度经线。
提示
Cesium平台内的所有用到坐标的地方,坐标均为Cartesian3对象
2 几种坐标的互转算法
// 屏幕坐标 转换为 笛卡尔空间直角坐标
// let cartesian3 = mars3d.PointUtil.getCurrentMousePosition(map.scene, windowPosition);//v3.8及之前版本
let cartesian3 = map.getCurrentMousePosition(windowPosition) // v3.9及之后版本
// 笛卡尔空间直角坐标 转换为 屏幕坐标
let windowPosition = mars3d.PointTrans.toWindowCoordinates(map.scene, cartesian3)
// 笛卡尔空间直角坐标 转换为 地理坐标(弧度制)
const cartographic = Cesium.Cartographic.fromCartesian(cartesian3)
// 笛卡尔空间直角坐标 转换为 地理坐标(经纬度)
const point = mars3d.LngLatPoint.fromCartesian(cartesian3)
// 地理坐标(弧度制) 转换为 笛卡尔空间直角坐标
let cartesian3 = Cesium.Cartesian3.fromRadians(lng, lat, height) // lng\lat为弧度制
// 地理坐标(经纬度) 转换为 笛卡尔空间直角坐标
let cartesian3 = Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
或者使用 mars3d.LngLatPoint 作为中间类来做转换
// 笛卡尔空间直角坐标 转换为 地理坐标(经纬度)
const point = mars3d.LngLatPoint.fromCartesian(cartesian3)
// 地理坐标(弧度制) 转换为 地理坐标(经纬度)
const point2 = mars3d.LngLatPoint.fromCartographic(cartographic)
// point 转换为 其他坐标
let cartesian3 = point.toCartesian() // 转换为 笛卡尔空间直角坐标
let cartographic = point.toCartographic() // 转换为 地理坐标(弧度制)
示例
map.on(mars3d.EventType.click, (event) => {
const point = mars3d.LngLatPoint.fromCartesian(event.cartesian) // 转为经纬度
console.log("鼠标单击坐标", point)
})
3. 支持多种形式坐标参数
为了方便使用者,Mars3D中大部分类的坐标参数均支持传入字符串、数组、经纬度对象或笛卡尔空间直角坐标等多种形式。 内部都是统一使用mars3d.LngLatPoint.parse方法做处理的,兼容多种形式的入参。
比如PointEntity类,支持下面多种参数形式,可以按个人习惯选用。
// 1.数组形式
let graphic = new mars3d.graphic.PointEntity({
position: [116.244399, 30.920459, 573.6],
style: { color: "#ff0000", pixelSize: 10 }
})
// 2.字符串形式
let graphic = new mars3d.graphic.PointEntity({
position: "116.301798, 30.835848, 915",
style: { color: "#ff0000", pixelSize: 10 }
})
// 3.对象形式
let graphic = new mars3d.graphic.PointEntity({
position: { lng: 116.301798, lat: 30.835848, alt: 915 },
style: { color: "#ff0000", pixelSize: 10 }
})
// 4.Cartesian3对象形式
let graphic = new mars3d.graphic.PointEntity({
position: Cesium.Cartesian3.fromDegrees(116.308659, 30.914005, 59),
style: { color: "#ff0000", pixelSize: 10 }
})
// 5.LatLngPoint对象形式【建议】
let graphic = new mars3d.graphic.PointEntity({
position: new mars3d.LngLatPoint(116.301798, 30.835848, 915),
style: { color: "#ff0000", pixelSize: 10 }
})
4 空间位置仿射变换处理
平台为我们提供了如下几种很有用的 计算机图形学中的变换工具类(如平移旋转缩放):
- Cesium.Cartesian3 :相当于Point3D
- Cesium.Matrix3 :3x3矩阵,用于描述旋转变换
- Cesium.Matrix4 :4x4矩阵,用于描述旋转加平移变换
- Cesium.Quaternion :四元数,用于描述围绕某个向量旋转一定角度的变换
- Cesium.Transforms :包含将位置转换为各种参考系的功能
提示
坐标需转换到笛卡尔坐标系(Cartesian3对象)后才能进行空间位置仿射变换处理。