动易网络 官方网站网站权重是怎么提升的
cesium-坐标系统
cesium坐标介绍
Cesium开发中常用的坐标系统主要有三个:屏幕坐标系统、笛卡儿空间直角坐标系统、地理坐标系统。屏幕坐标系统是二维坐标,空间直角坐标系统是三维坐标系,而地理坐标是球面经纬度坐标。
屏幕坐标系统(Cartesian2)
屏幕坐标是平面直角坐标系,是二维笛卡儿坐标系。Cesium中使用Cartesian2来描述屏幕坐标系。构造函数是new Cesium.Cartesian2(x, y)。具体是鼠标点击位置距离canvas左上角的像素值。屏幕左上角为原点(0.0),屏幕水平方向为X轴,向右为正,垂直方向为Y轴,向下为正,如图所示。
笛卡儿空间直角坐标系(Cartesian3)
以空间中O点为原点,建立三条两两垂直的数轴;X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标),建立了空间直角坐标系0—XYZ。 笛卡儿空间直角坐标的原点就是椭球的中心,在计算机上进行绘图时,不方便使用经纬度直接进行绘图,一般会将坐标系转换为笛卡儿坐标系,使用计算机图形学中的知识进行绘图。构造函数是new Cesium.Cartesian3(x,y,z),这里的Cartesian3里面的下x,y,z即为笛卡儿坐标系三个坐标轴方向上的分量。
WGS-84地理坐标
首先将地球抽象成一个规则的逼近原始自然地球表面的椭球体,称为参考椭 球体,然后在参考椭球体上定义系列的经线 和纬线构成经纬网。需要说明的是经纬地理坐标系不是平面坐标系,因为度不是标准的长度单位,不可用其直接量测长度和面积。基于椭球体表示空间点的位置采用三个参数:大地经度、大地纬度、大地高。
大地经度:参考椭球面上某点的大地子午面与本初子午面间的两面角。向东为正,向西为负。
大地纬度:参考椭球面上某点的法线与赤道平面的夹角。向北为正,向南为负。
大地高:指某点沿法线方向到参考椭球面的距离。
不同的椭球体大小、定位与定向决定了不同的坐标系统。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都是弧度坐标值。
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弧度=180/π度,1度=π/180弧度角度A1转换弧度A2:A2=A1*π/180弧度A2转换角度A1:A1=A2*π/PI
角度与弧度的转换
- 角度转弧度:
var radians=Cesium.CesiumMath.toRadians(degrees);
- 弧度转角度:
var degrees=Cesium.CesiumMath.toDegrees(radians);
经纬度坐标转换为笛卡尔空间直角坐标
- 直接通过经纬度转换。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]
- 通过椭球体进行转换。根据椭球参数将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]);
也可使用弧度形式的经纬度,函数如下: Ceium.Cartesian3.fonmRadins,Cestum.Cartesian3.fomRadinsArmy,Ceium.Cartesian3.fromRadiansArrayHeights等,用法与上面一样。
笛卡儿空间直角坐标系转换为经纬度坐标
直接转换
Cesium中可将笛卡儿空间直角坐标直接转为WGS-84经纬度坐标,方法如下:
var cartorgraphic=Cesium.Cartographic.fromCartesian(cartesian3);
转换得到WGS-84坐标系下的弧度形式经纬度后,再将其转换为角度的形式。
通过椭球体转换
可以根据椭球参数,将笛卡儿空间直角坐标转为WGS-84坐标或其他椭球下的经纬度坐标。以WGS-84椭球转换为例:
对于一个坐标,可采用如下代码:
var cartographic=Cesium.Ellipsoid.wgs84.cartesianToCartgraphic(cartesian3);
对于一组坐标,可采用如下代码:
var cartographic=Cesium.Ellipsoid.wgs84.cartesianArrayToCartgraphic([cartesian1,cartesian2,cartesian3]);
屏幕坐标和笛卡儿空间直角坐标的转换
屏幕坐标转笛卡儿空间直角坐标常用于三维场景开发,Cesium根据不同场景设定三类屏幕坐标转换笛卡儿坐标:
屏幕坐标转场景空间直角坐标
这里的场景坐标是包含了地形、倾斜摄影测量模型等其他三维模型的坐标。
var cartesian3= viewer.scene.pickPosition(cartesian2);
屏幕坐标转地表笛卡儿空间坐标
包含地形在内,但是不包括倾斜摄影测量模型等其他三维模型的坐标。
var cartesian3=viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);
屏幕坐标转椭球面笛卡儿空间坐标
不包含地形、倾斜摄影测量模型等其他三维模型的坐标
var cartesian3= viewer.scene.camera.pickEllipsoid(cartesian2);
笛卡尔空间直角坐标转屏幕坐标
var c2=Cesium.SceneTransfroms.wgs84ToWindowCoordinates(cartesian3);