15 Cesium—地形服务-地形数据采样

文章中所有操作均是在 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)
});

运行结果:


注:代码仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WorkLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值