购买了网站如何使用,做辅食网站,浏览器网页截图快捷键,erp开发cesium-坐标系统
cesium坐标介绍
Cesium开发中常用的坐标系统主要有三个#xff1a;屏幕坐标系统、笛卡儿空间直角坐标系统、地理坐标系统。屏幕坐标系统是二维坐标#xff0c;空间直角坐标系统是三维坐标系#xff0c;而地理坐标是球面经纬度坐标。
屏幕坐标系统(Cartes…cesium-坐标系统
cesium坐标介绍
Cesium开发中常用的坐标系统主要有三个屏幕坐标系统、笛卡儿空间直角坐标系统、地理坐标系统。屏幕坐标系统是二维坐标空间直角坐标系统是三维坐标系而地理坐标是球面经纬度坐标。
屏幕坐标系统(Cartesian2)
屏幕坐标是平面直角坐标系是二维笛卡儿坐标系。Cesium中使用Cartesian2来描述屏幕坐标系。构造函数是new Cesium.Cartesian2x, y。具体是鼠标点击位置距离canvas左上角的像素值。屏幕左上角为原点0.0屏幕水平方向为X轴向右为正垂直方向为Y轴向下为正如图所示。 笛卡儿空间直角坐标系(Cartesian3)
以空间中O点为原点建立三条两两垂直的数轴X轴(横坐标)、Y轴(纵坐标)、Z轴(竖坐标)建立了空间直角坐标系0—XYZ。 笛卡儿空间直角坐标的原点就是椭球的中心在计算机上进行绘图时不方便使用经纬度直接进行绘图一般会将坐标系转换为笛卡儿坐标系使用计算机图形学中的知识进行绘图。构造函数是new Cesium.Cartesian3(xyz)这里的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(longitudelatitudeheight)来描述地理坐标这里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转换弧度A2A2A1*π/180弧度A2转换角度A1A1A2*π/PI角度与弧度的转换
角度转弧度
var radiansCesium.CesiumMath.toRadians(degrees);弧度转角度
var degreesCesium.CesiumMath.toDegrees(radians);经纬度坐标转换为笛卡尔空间直角坐标
直接通过经纬度转换。Cesium默认WGS-84经纬度坐标可直接通过以下方法进行坐标转换:
var c3Cesium.Cartesian3.fromDegrees(longitude,latitude,height);//height为大地高度
var c3Cesium.Cartesian3.fromDegreesArrary(coordinates);//coordinates格式为不带高度的数组例如[-115.0,37.0,-107.0,33.0]
var c3Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带高度的数组如:[-155.0,37.0,100000 -107.0,33.0,150000.0]通过椭球体进行转换。根据椭球参数将WGS-84经纬度坐标或其他地理坐标转为笛卡儿空间直角坐标。以WGS-84椭球体为例将WGS-84经纬度坐标转为空间直角坐标:
var ellipsoid84Cesium.Ellipsoid.wgs84;
var positionCesium.Cartographic.fromDegrees(longitude,latitude,height);
var c3ellipsoid84.cartographicToCartesian(position);
var c3sellipsoid84.cartographicArrayToCartesianArray([pos1,pos2,pos3]);也可使用弧度形式的经纬度函数如下 Ceium.Cartesian3.fonmRadinsCestum.Cartesian3.fomRadinsArmyCeium.Cartesian3.fromRadiansArrayHeights等用法与上面一样。
笛卡儿空间直角坐标系转换为经纬度坐标
直接转换
Cesium中可将笛卡儿空间直角坐标直接转为WGS-84经纬度坐标方法如下:
var cartorgraphicCesium.Cartographic.fromCartesian(cartesian3);转换得到WGS-84坐标系下的弧度形式经纬度后再将其转换为角度的形式。
通过椭球体转换
可以根据椭球参数将笛卡儿空间直角坐标转为WGS-84坐标或其他椭球下的经纬度坐标。以WGS-84椭球转换为例
对于一个坐标可采用如下代码
var cartographicCesium.Ellipsoid.wgs84.cartesianToCartgraphic(cartesian3);对于一组坐标,可采用如下代码
var cartographicCesium.Ellipsoid.wgs84.cartesianArrayToCartgraphic([cartesian1,cartesian2,cartesian3]);屏幕坐标和笛卡儿空间直角坐标的转换
屏幕坐标转笛卡儿空间直角坐标常用于三维场景开发Cesium根据不同场景设定三类屏幕坐标转换笛卡儿坐标
屏幕坐标转场景空间直角坐标
这里的场景坐标是包含了地形、倾斜摄影测量模型等其他三维模型的坐标。
var cartesian3 viewer.scene.pickPosition(cartesian2);屏幕坐标转地表笛卡儿空间坐标
包含地形在内但是不包括倾斜摄影测量模型等其他三维模型的坐标。
var cartesian3viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);屏幕坐标转椭球面笛卡儿空间坐标
不包含地形、倾斜摄影测量模型等其他三维模型的坐标
var cartesian3 viewer.scene.camera.pickEllipsoid(cartesian2);笛卡尔空间直角坐标转屏幕坐标
var c2Cesium.SceneTransfroms.wgs84ToWindowCoordinates(cartesian3);