文章中所有操作均是在 Cesium 1.91 版本下进行的,其它版本差异请自行适配
地形数据采样
地形数据处理和加载之后,我们再介绍 Cesium 地形数据采样接口:sampleTerrain。sampleTerrain 接口允许我们使用异步方式请求指定坐标点的高程信息。在 API 帮助文档里查看如下:
接口需要三个参数:
- terrainProvider:地形数据源
- level:请求数据的等级
- positions:请求数据的坐标数组
示例中,sampleTerrain 返回是 promise 异步类型对象,需要使用 when 接口调用获取结果。
因为作者手中没有成行的地形数据,所以我就随便加载了一个地形数据,进行了测试。
代码片段如下:
const viewer = new Cesium.Viewer("cesiumContainer");
//现成的地形数据
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: Cesium.IonResource.fromAssetId(3956),
requestWaterMask: true,
requestVertexNormals: TextTrackCue
});
viewer.terrainProvider = terrainProvider;
//获取图层
var cesiumEventHandler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
var ellipsoid = viewer.scene.globe.ellipsoid;//得到当前三维场景的椭球体
//直接在图层上设置点击操作
cesiumEventHandler.setInputAction(function(movement){
var cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);//movement.endPosition
if(cartesian){
//将笛卡尔坐标转换为地理坐标
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var longitudeDegree = Cesium.Math.toDegrees(cartographic.longitude);
var latitudeDegree = Cesium.Math.toDegrees(cartographic.latitude);
terrainTools.pointsTerrainData([{"lon": longitudeDegree, "lat": latitudeDegree}], function(terrainData){
if (terrainData.length > 0) {
console.log("lon:" + Cesium.Math.toDegrees(terrainData[0].longitude) +
"\nlat:" + Cesium.Math.toDegrees(terrainData[0].latitude) +
"\nheight:" + (terrainData[0].height ? terrainData[0].height : 0)
);
} else {
console.log("nodata");
}
});
}
}, Cesium.ScreenSpaceEventType.LEFT_UP);
//工具类
var terrainTools = {
pointsTerrainData:function(lonlats, callback){
//请求高程
var pointArrInput = [];
for(var i = 0; i < lonlats.length; i++){
pointArrInput.push(Cesium.Cartographic.fromDegrees(lonlats[i].lon, lonlats[i].lat));
}
var promise = Cesium.sampleTerrain(terrainProvider, 1, pointArrInput);//pointArrInput
Cesium.when(promise, function(updatedPositions){
callback(updatedPositions);
});
}
};
//设置初始位置
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(116.75199, 36.55358, 20000)
});
运行结果:
注:代码仅供参考。