cesium 坐标系介绍与转换

545 阅读5分钟

cesium 坐标系介绍与转换

WGS84经纬度坐标系(没有实际对象)

WGS84弧度坐标系(Cartographic)

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

平面坐标系(Cartesian2)

4D笛卡尔坐标系(Cartesian4) 使用较少暂不介绍

1 WGS84经纬度坐标系(World Geodetic System 1984)

WGS84是为 GPS 全球定位系统建立的坐标系统,是世界上第一个统一的地心坐标系,因此也被称为大地坐标系原始坐标系。一般通过GPS记录仪记录下来的经纬度,就是基于WGS84坐标系的数据。

它是以地图的质点为原点是地球的质心,空间直角坐标系的Z轴指向BIH(1984.0)定义的地极(CTP)方向,即国际协议原点CIO,它由IAU和IUGG共同推荐。X轴指向BIH定义的零度子午面和CTP赤道的交点,Y轴和Z,X轴构成右手坐标系WGS-84椭球采用国际大地测量与地球物理联合会第17届大会测量常数推荐值,采用的两个常用基本几何参数。

WGS-84是修正NSWC9Z-2参考系的原点和尺度变化,并旋转其参考子午面与BIH定义的零度子午面一致而得到的一个新参考系,WGS-84坐标系的原点在地球质心,Z轴指向BIH1984.0定义的协定地球极(CTP)方向,X轴指向BIH1984.0的零度子午面和CTP赤道的交点,Y轴和Z、X轴构成右手坐标系。它是一个地固(地心固连)坐标系。 image.png

在Cesium中没有实际的对象来描述WGS84经纬度坐标系。

2 WGS84弧度坐标系(Cartographic)

类介绍

 new Cesium.Cartographic(longitude,latitude,height)

他接收三个参数分别是经度纬度高度 ;其内部计算原理为: 弧度 = π/180 × 经纬度角度

3 笛卡尔空间直角坐标系(Cartesian3)

以空间中O点为原点,建立三条两两垂直的数轴。X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标)建立了空间直角坐标系O-XYZ。笛卡尔空间直角坐标系的原点就是椭球的中心。 类介绍

new Cesium.Cartesian3(x,y,z)

他接收三个参数分别代表在x、y、z轴上的值。

4 平面坐标系(Cartesian2)

它是一个二维的笛卡尔坐标系

image.png

类介绍

new Cesium.Cartesian2(x,y)

他接收俩个参数分别代表在x、y轴上的值。

坐标系之间的相互转换

1 经纬度与弧度的转换

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

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

2 WGS84经纬度坐标系与WGS84弧度坐标系的转换

1)构造函数法

通过将经纬度转换为弧度后直接 new Cesium.Cartographic(longitude弧度, latitude弧度, height米)

2)精通函数法

通过var cartographic= Cesium.Cartographic.fromDegrees(longitude经度, latitude纬度, height米)直接转换;
类似的还有var cartographic= Cesium.Cartographic.fromRadians(longitude弧度, latitude弧度, height米)方法,传入的是弧度。

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

WGS84 ——> 笛卡尔空间直角坐标系

1).通过经纬度或弧度进行转换:
var c3= Cesium.Cartesian3.fromDegrees(longitude, latitude, height) ;高度height可不填写。
var c3s=Cesium.Cartesian3.fromDegreesArray(coordinates);coordinates格式为不带高度的数组。例如:[-115.0, 37.0, -107.0, 33.0]
var c3s=Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);coordinates格式为带有高度的数组。例如:[-115.0, 37.0, 100000.0, -107.0, 33.0, 150000.0]
同理将度转化为弧度,然后再进行转换,
和上面一样有Cesium.Cartesian3.fromRadiansCesium.Cartesian3.fromRadiansArrayCesium.Cartesian3.fromRadiansArrayHeights等方法,用法和上面一样,只是度需要转换为弧度,这里不再讲这些方法。

其实fromDegrees内部也是用的fromRadians方法,这点大家可以了解下,另外WGS84坐标系转笛卡尔空间直角坐标系代码如下,大家可以了解下转换过程:

Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) {
        //>>includeStart('debug', pragmas.debug);
        Check.typeOf.number('longitude', longitude);
        Check.typeOf.number('latitude', latitude);
        //>>includeEnd('debug');

        height = defaultValue(height, 0.0);
        var radiiSquared = defined(ellipsoid) ? ellipsoid.radiiSquared : wgs84RadiiSquared;

        var cosLatitude = Math.cos(latitude);
        scratchN.x = cosLatitude * Math.cos(longitude);
        scratchN.y = cosLatitude * Math.sin(longitude);
        scratchN.z = Math.sin(latitude);
        scratchN = Cartesian3.normalize(scratchN, scratchN);

        Cartesian3.multiplyComponents(radiiSquared, scratchN, scratchK);
        var gamma = Math.sqrt(Cartesian3.dot(scratchN, scratchK));
        scratchK = Cartesian3.divideByScalar(scratchK, gamma, scratchK);
        scratchN = Cartesian3.multiplyByScalar(scratchN, height, scratchN);

        if (!defined(result)) {
            result = new Cartesian3();
        }
        return Cartesian3.add(scratchK, scratchN, result);
    };

2).通过度来进行转换
var position = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
var c3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
var c3s=Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([position1,position2,position3]) 弧度同理

笛卡尔空间直角坐标系——>WGS84

1).直接转换

var cartographic= Cesium.Cartographic.fromCartesian(cartesian3)
转换得到WGS84弧度坐标系后再使用经纬度和弧度的转换,进行转换到目标值
2)、间接转换
var cartographic= Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3)

var cartographics= Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray([cartesian1,cartesian2,cartesian3])

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

平面坐标系转笛卡尔空间直角坐标系

这里需要说明的是当前的点必须在三维球上,否则返回的是undefined,我们在ScreenSpaceEventHandler回调会取到的坐标都是Cartesian2,大家可以测试观察下。
1.屏幕坐标转场景WGS84坐标,这里的场景坐标是包含了地形、倾斜、模型的坐标。
转换方法为:var cartesian3= viewer.scene.pickPosition(Cartesian2),目前IE浏览器不支持深度拾取,所以用不了这个方法。
2.屏幕坐标转地表坐标,这里是地球表面的WGS84坐标,包含地形,不包括模型、倾斜摄影表面。
转换方法为:var cartesian3= viewer.scene.globe.pick(viewer.camera.getPickRay(Cartesian2),viewer.scene);
3.屏幕坐标转椭球面坐标,这里的椭球面坐标是参考椭球的WGS84坐标,不包含地形、模型、倾斜摄影表面。
转换方法为:var cartesian3= viewer.scene.camera.pickEllipsoid(Cartesian2)

笛卡尔空间直角坐标系转平面坐标系

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