# cesium-坐标系统

# cesium坐标介绍

Cesium开发中常用的坐标系统主要有三个:屏幕坐标系统、笛卡儿空间直角坐标系统、地理坐标系统。屏幕坐标系统是二维坐标,空间直角坐标系统是三维坐标系,而地理坐标是球面经纬度坐标。

# 屏幕坐标系统(Cartesian2)

屏幕坐标是平面直角坐标系,是二维笛卡儿坐标系。Cesium中使用Cartesian2来描述屏幕坐标系。构造函数是new Cesium.Cartesian2(x, y)。具体是鼠标点击位置距离canvas左上角的像素值。屏幕左上角为原点(0.0),屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正,如图所示。

image-20220202112948001

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

以空间中O点为原点,建立三条两两垂直的数轴;X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标),建立了空间直角坐标系0—XYZ。 笛卡儿空间直角坐标的原点就是椭球的中心,在计算机上进行绘图时,不方便使用经纬度直接进行绘图,一般会将坐标系转换为笛卡儿坐标系,使用计算机图形学中的知识进行绘图。构造函数是new Cesium.Cartesian3(x,y,z),这里的Cartesian3里面的下x,y,z即为笛卡儿坐标系三个坐标轴方向上的分量。

image-20220202113838008

# WGS-84地理坐标

image-20220202114708257

首先将地球抽象成一个规则的逼近原始自然地球表面的椭球体,称为参考椭 球体,然后在参考椭球体上定义系列的经线 和纬线构成经纬网。需要说明的是经纬地理坐标系不是平面坐标系,因为度不是标准的长度单位,不可用其直接量测长度和面积。基于椭球体表示空间点的位置采用三个参数:大地经度、大地纬度、大地高。

大地经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。向东为正,向西为负。

大地纬度:参考椭球面上某点的法线与赤道平面的夹角。向北为正,向南为负。

大地高:指某点沿法线方向到参考椭球面的距离。

不同的椭球体大小、定位与定向决定了不同的坐标系统。WGS-84是为美国全球定位系统(GPS)的使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH 1984.0定义的协议地球极(CTP)方向。X轴指向BIH1984.0定义的零子午面和CTP赤道的交点。Y轴与Z轴、X轴垂直构成右手坐标系。经度范围为[-180°,180°],纬度范围为[- 90°,90°]。WGS-84是目前应用范围最为广泛的地理坐标系,通常国外通感影像均采用WGS-84。Cesium中定义Cartographic ,用new Cesium.Cartographic(longitude,latitude,height)来描述地理坐标,这里longitude、latitude都是弧度坐标值。

image-20220202114103214

# cesium坐标转换

  • 角度经纬度(一般这就是指经纬度):39.905556 116.424722
  • 度分秒经纬度:北纬39°54′20″,东经116°25′29″
  • 弧度经纬度:0.6964833420389782 2.0319947296190777
  • 地理经纬度(度)与经纬度(度分秒)之间互转
public static double Dms2Degree(CoordDms dms){
    if (null != dms)
    {
        decimal decD = new decimal(dms.Degree);
        decimal decM = new decimal(dms.Minute);
        decimal decS = new decimal(dms.Second);
        decimal dec60 = new decimal(60.0);

        decimal decDDouble = decD + (decM / dec60) + (decS / dec60 / dec60);
        return decimal.ToDouble(decDDouble);
    }
    return 0;
}

public static CoordDms Degree2Dms(double d){
    decimal dec = new decimal(d);
    Decimal dec60 = new decimal(60.0);
    CoordDms cd = new CoordDms();
    cd.Degree = decimal.ToInt32(dec);
    decimal min = decimal.Multiply(dec - new decimal(cd.Degree), dec60);
    cd.Minute = decimal.ToInt32(min);
    decimal sec = min - new decimal(cd.Minute);
    cd.Second = decimal.ToDouble(decimal.Multiply(sec, dec60));
    return cd;
}

public class CoordDms{
    public int Degree { get; set; }
    public int Minute { get; set; }
    public Double Second { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  • 角度经纬度和弧度转换
1弧度=180/π度,1度=π/180弧度

角度A1转换弧度A2:A2=A1*π/180

弧度A2转换角度A1:A1=A2*π/PI
1
2
3
4
5

# 角度与弧度的转换

  • 角度转弧度:
var radians=Cesium.CesiumMath.toRadians(degrees);
1
  • 弧度转角度:
var degrees=Cesium.CesiumMath.toDegrees(radians);
1

# 经纬度坐标转换为笛卡尔空间直角坐标

  1. 直接通过经纬度转换。Cesium默认WGS-84经纬度坐标,可直接通过以下方法进行坐标转换:
var c3=Cesium.Cartesian3.fromDegrees(longitude,latitude,height);//height为大地高度
var c3=Cesium.Cartesian3.fromDegreesArrary(coordinates);//coordinates格式为不带高度的数组,例如[-115.0,37.0,-107.0,33.0]
var c3=Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带高度的数组,如:[-155.0,37.0,100000 -107.0,33.0,150000.0]
1
2
3
  1. 通过椭球体进行转换。根据椭球参数将WGS-84经纬度坐标或其他地理坐标转为笛卡儿空间直角坐标。以WGS-84椭球体为例,将WGS-84经纬度坐标转为空间直角坐标:
var ellipsoid84=Cesium.Ellipsoid.wgs84;
var position=Cesium.Cartographic.fromDegrees(longitude,latitude,height);
var c3=ellipsoid84.cartographicToCartesian(position);
var c3s=ellipsoid84.cartographicArrayToCartesianArray([pos1,pos2,pos3]);
1
2
3
4

也可使用弧度形式的经纬度,函数如下: Ceium.Cartesian3.fonmRadins,Cestum.Cartesian3.fomRadinsArmy,Ceium.Cartesian3.fromRadiansArrayHeights等,用法与上面一样。

# 笛卡儿空间直角坐标系转换为经纬度坐标

# 直接转换

Cesium中可将笛卡儿空间直角坐标直接转为WGS-84经纬度坐标,方法如下:

var cartorgraphic=Cesium.Cartographic.fromCartesian(cartesian3);
1

转换得到WGS-84坐标系下的弧度形式经纬度后,再将其转换为角度的形式。

# 通过椭球体转换

可以根据椭球参数,将笛卡儿空间直角坐标转为WGS-84坐标或其他椭球下的经纬度坐标。以WGS-84椭球转换为例:

对于一个坐标,可采用如下代码:

var cartographic=Cesium.Ellipsoid.wgs84.cartesianToCartgraphic(cartesian3);
1

对于一组坐标,可采用如下代码:

var cartographic=Cesium.Ellipsoid.wgs84.cartesianArrayToCartgraphic([cartesian1,cartesian2,cartesian3]);
1

# 屏幕坐标和笛卡儿空间直角坐标的转换

屏幕坐标转笛卡儿空间直角坐标常用于三维场景开发,Cesium根据不同场景设定三类屏幕坐标转换笛卡儿坐标:

# 屏幕坐标转场景空间直角坐标

这里的场景坐标是包含了地形、倾斜摄影测量模型等其他三维模型的坐标。

var cartesian3= viewer.scene.pickPosition(cartesian2);
1

# 屏幕坐标转地表笛卡儿空间坐标

包含地形在内,但是不包括倾斜摄影测量模型等其他三维模型的坐标。

var cartesian3=viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);
1

# 屏幕坐标转椭球面笛卡儿空间坐标

不包含地形、倾斜摄影测量模型等其他三维模型的坐标

var cartesian3= viewer.scene.camera.pickEllipsoid(cartesian2);
1

# 笛卡尔空间直角坐标转屏幕坐标

var c2=Cesium.SceneTransfroms.wgs84ToWindowCoordinates(cartesian3);
1
上次更新时间: 2022年5月20日星期五上午11点16分