cesium开发中常用的坐标系统
Cesium目前支持两种坐标系WGS84地理WKID=4326和WebMercator:WKID=3857,但是在Cesium中没有实际的对象来描述WGS84坐标,都是以弧度的方式来进行运用的也就是Cartographic类:
也就是二维笛卡尔坐标系cesium中使用Cartesian2来描述屏幕坐标系统
构造函数为new Cesium.Cartesian2(x, y)
,屏幕左上角为原点,x右为正,y下为正
而openlayers中
在GIS引擎中也称这种笛卡尔空间直角坐标系为(World Geodetic System 1984 (WGS84) 坐标系)
new Cesium.Cartesian3(x, y, z)
注意这里不要和WGS84地理坐标或者是WGS84椭球体混淆,这只是一个三维的笛卡尔坐标系的定义(只是指定轴向,原点位置等),并不像WGS84那样包含一些椭球参数
new Cesium.Cartographic(longitude, latitude, height)
注:Cartographic的经纬度是用弧度表示的,经纬度其实就是角度。弧度即角度对应弧长是半径的倍数。
所以经纬度是以弧度为单位的,高度是以米为单位。
弧度= π / 180 × 角度
角度=180 / π × 弧度
//角度转弧度
var radians = Cesium.CesiumMath.toRadians(degrees)
//弧度转角度
var degrees = Cesium.CesiumMath.toDegrees(radians)
Cesium在绘图过程中需要使用笛卡尔空间直角坐标(如WGS84笛卡尔坐标系),因此需要将经纬度坐标
转换为笛卡尔坐标,才能用于绘图。
cartographic:弧度制表示的地理坐标系
。使用(经度,纬度,大地高)表示。
直接转换:
Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
ellipsoid:该Cartesian3所使用的椭球,默认为Ellipsoid.WGS84
result:存储结果的对象
Cesium.Cartesian3.fromDegreesArray(coordinates, ellipsoid, result)
coordinates:经纬度数组列表,用于批量转换[经度,纬度,进度,纬度,。。。。]
let cartesian3s = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);
coordinates:[经度,纬度,高度,进度,纬度,高度]
弧度制也类似,使用Cesium.Cartesian3.fromRadians
, Cesium.Cartesian3.fromRadiansArray
, Cesium.Cartesian3.fromRadiansArrayHeights
//先转换为弧度坐标
let position = Cesium.Cartographic.fromDegrees(lon, lat, height);
//获取viewer椭球体实例
let ellipsoid = viewer.scene.globe.ellipsoid;
//开始转换
let cartesian3 = ellipsoid.cartographicToCartesian(position);
// 多个坐标
let cartesian3s = ellipsoid.cartographicArrayToCartesianArray(positions);
//直接转换得到的是WGS84弧度制的经纬度坐标,可将其再转换为角度制。
let cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
//需要选着或创建地理坐标的椭球体参数
// 单个坐标
let cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
// 多个坐标
let cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographic(cartesain3Array);
屏幕坐标和迪卡尔空间直角坐标系的转换
屏幕转椭球面笛卡尔坐标
,不包含地形、模型等的坐标
Cesium中的Camera
提供了pickEllipsoid
方法:传送门
let cartesain3 = viewer.scene.camera.pickEllipsoid(cartesian2);
屏幕转场景坐标
,包含地形和模型等的场景空间坐标
使用Scene
类中的pickPosition
方法实现:传送门
let cartesian3 = viewer.scene.pickPosition(cartesian2);
屏幕坐标转地表笛卡尔空间坐标
通过相机与屏幕点位连线来求取坐标。
使用Scene类中globe属性中的pick方法:
let ray = viewer.camera.getPickRay(cartesian2);
let cartesian3 = globe.pick(ray,viewer.scene);
Cesium提供了SceneTransforms的wgs84ToWindowCoordinates方法将笛卡尔坐标转换为屏幕坐标
let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(cartesian3);