问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Cesium中的坐标系统简单说明

创作时间:
作者:
@小白创作中心

Cesium中的坐标系统简单说明

引用
CSDN
1.
https://blog.csdn.net/hap1994/article/details/139521720

Cesium是一款功能强大的开源3D地球和地图可视化工具,广泛应用于地理信息系统、虚拟现实等领域。在使用Cesium进行开发时,理解其坐标系统及其转换方法是至关重要的。本文将详细介绍Cesium中的三种坐标系统:地理坐标、世界坐标和屏幕坐标,并提供具体的转换方法和代码示例。

一、坐标系统

Cesium中坐标系统主要分为三种:地理坐标、世界坐标(X,Y,Z)和屏幕坐标。

  • 地理坐标:通常用于位置表达,可以采用经纬度或弧度两种方式表示。
  • 世界坐标:采用右手系的笛卡尔空间直角坐标系,原点位于椭球中心。在Cesium中,使用Cartesian3类表示,类似于三维系统中的Point3D对象。
  • 屏幕坐标:用于表示屏幕显示的二维坐标,左上角为坐标原点,常用于用户交互。

二、坐标转换

1. 角度和弧度互转

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

2. 地理经纬度转地理弧度

// 方法一:
var longitude = Cesium.Math.toRadians(lng); // 其中 lng为经度
var latitude = Cesium.Math.toRadians(lat); // 其中 lat为纬度
var cartographic = new Cesium.Cartographic(longitude, latitude, height);

// 方法二:
var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); // 其中,lng和lat为经纬度

// 方法三:
var cartographic = Cesium.Cartographic.fromRadians(longitude, latitude, height); // 其中,longitude和latitude为弧度

3. 经纬度转世界坐标

lnglatToCartesian(lng, lat, height) {
    // 直接转换
    var cartesian3 = Cesium.Cartesian3.fromDegrees(lng, lat, height);
    // 先转弧度后转笛卡尔
    // var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); // 单位:度,度,米
    // var ellipsoid = viewer.scene.globe.ellipsoid;
    // var cartesian3 = ellipsoid.cartographicToCartesian(cartographic);
    return cartesian3;
}

4. 世界坐标转经纬度

Cesium不支持笛卡尔坐标直接转经纬度,需要先转换为弧度,再由弧度转化为经纬度

cart3Tolnglat(cartesian3) {
    var ellipsoid = this._viewer.scene.globe.ellipsoid;
    const cartograhphic = ellipsoid.cartesianToCartographic(cartesian3);
    var lat = Cesium.Math.toDegrees(cartograhphic.latitude);
    var lng = Cesium.Math.toDegrees(cartograhphic.longitude);
    var height = cartographic.height;
    return [lng, lat, height];
}

5. 世界坐标转屏幕坐标

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

6. 屏幕坐标转世界坐标

坐标获取

var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
handler.setInputAction(function (event) {
    // event.position为屏幕坐标
    console.log(event.position);
    // 获取包含了地形、倾斜摄影表面、模型的世界坐标
    // 解决在没有3dTile模型下的笛卡尔坐标不准问题, viewer.scene.globe.depthTestAgainstTerrain = true; // 默认为false
    var pickedPosition = viewer.scene.pickPosition(event.position);
    if (Cesium.defined(pickedPosition)) {
        console.log('1', pickedPosition);
    }
    // 获取地球表面的世界坐标,包含地形,不包含其他模型
    // Create a ray from the camera position through the pixel at windowPosition in world coordinates.
    var ray = viewer.camera.getPickRay(event.position);
    // Find an intersection between a ray and the globe surface that was rendered. The ray must be given in world coordinates.
    var position2 = viewer.scene.globe.pick(ray, viewer.scene);
    console.log('2', position2);
    // 获取参考椭球的世界坐标
    var position3 = viewer.scene.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid);
    console.log('3', position3);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

本文详细介绍了Cesium中的坐标系统及其转换方法,对于学习Cesium开发的读者具有较高的参考价值。通过本文,读者可以更好地理解Cesium中的坐标系统,掌握各种坐标之间的转换方法,从而更高效地进行开发工作。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号