本文已参与「新人创作礼」活动,一起开启掘金创作之路。
作为开源WebGIS
三维可视化领域的翘楚,Cesium
中可以添加不同类型数据,这些数据可以以不同的坐标形式定位在地球上,那么这里就出现了一个问题,不同形式的坐标之间,如何转换呢?这里就介绍一下Cesium
里面如何进行坐标转换。
坐标类型
要做坐标转换,首先要明白坐标有哪些表现形式,在Cesium
中,有以经纬度和高形(longitude, latitude, height)
式的坐标,也有笛卡尔坐标Cartesian(X, Y, Z)
形式,还有平面坐标(x,y)
。
笛卡尔坐标系,是以椭球中心为原点,也称为空间直角坐标系,Cesium
默认是使用的WGS84
坐标系统。
经纬度坐标转笛卡尔空间直角坐标。
Cesium
中有Cartesian3
类,这个类中有一个fromDegrees
方法可以将经纬度坐标转换为笛卡尔坐标。
//经纬度地理坐标再转笛卡尔世界坐标
//其中height, ellipsoid, result,是可选的,分别是高度,椭球,和转换结果
let cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
console.log("经纬度地理坐标再转笛卡尔世界坐标:");
console.log(cartesian);
空间直角坐标转经纬度。
scene
类中的globe
属性的ellipsoid
类有cartesianToCartographic
方法,可以将笛卡尔空间直角坐标系转为经纬度高,转换后的经纬度结果是弧度制,需要将弧度转换为度。
//笛卡尔世界坐标
console.log("笛卡尔世界坐标:");
console.log(worldPosition);
//笛卡尔世界坐标转经纬度弧度坐标
let cartographic = window.viewer.scene.globe.ellipsoid.cartesianToCartographic(worldPosition);
console.log("经纬度弧度坐标:");
console.log(cartographic);
//经纬度弧度坐标转经纬度坐标
let lon = Cesium.Math.toDegrees(cartographic.longitude);
let lat = Cesium.Math.toDegrees(cartographic.latitude);
let height = cartographic.height;
console.log("经纬度地理坐标:");
console.log(lon + "," + lat + "," + height);
笛卡尔空间直角坐标转平面坐标。
Cartesian2
类中有fromCartesian3
类,可以将笛卡尔空间直角坐标转为平面坐标
//经纬度地理坐标转平面坐标
let panCoord = Cesium.Cartesian2.fromCartesian3(worldPosition, panCoord);
console.log("经纬度地理坐标转平面坐标:");
console.log(panCoord);