Cesium计算坡度坡向分析

cesium 计算坡度分析原理:(官网设置的是全球globe的material)

1.计算地形的坡度,把地形分成若干个面,然后就可以把面看为一个点,然后计算面的坡度(面可以自己画)

2.根据坡度大小设置不同的颜色,然后设置方向

 



//绘制小矩形面 四个经纬度的点,z值高度可以忽略 如:113.xx  ,37.xx,0 ,113.xx,37.xx,0
function drawSlopePolygon(startx1, starty1, startz1, startx2, starty2, startz2, startx3, starty3, startz3, startx4, starty4, startz4) {
            
    //高度z全为0
    var count = 100;
    var slopelineposition = [];
    var hireacys = [];
    var hireacysdistance = []
    for (j = 0; j < 100; j++) {
        for (var i = 0; i < 100; i++) {
              var hireacy = [] ;
              //分割成小面,切分经纬度
            hireacy.push(new Cesium.Cartesian3(startx1 + (startx2 - startx1) / count * i + (startx4 + (startx3 - startx4) / count * (i) - startx1 - (startx2 - startx1) / count * i) / count * j,
                  starty1 + (starty2 - starty1) / count * i + (starty4 + (starty3 - starty4) / count * (i) - starty1 - (starty2 - starty1) / count * i) / count * j,
                  startz1 + (startz2 - startz1) / count * i + (startz4 + (startz3 - startz4) / count * (i) - startz1 - (startz2 - startz1) / count * i) / count * j))
            hireacy.push(new Cesium.Cartesian3(startx1 + (startx2 - startx1) / count * (i + 1) + (startx4 + (startx3 - startx4) / count * (i + 1) - startx1 - (startx2 - startx1) / count * (i + 1)) / count * j, 
                  starty1 + (starty2 - starty1) / count * (i + 1) + (starty4 + (starty3 - starty4) / count * (i + 1) - starty1 - (starty2 - starty1) / count * (i + 1)) / count * j,
                  startz1 + (startz2 - startz1) / count * (i + 1) + (startz4 + (startz3 - startz4) / count * (i + 1) - startz1 - (startz2 - startz1) / count * (i + 1)) / count * j))
            hireacy.push(new Cesium.Cartesian3(startx4 + (startx3 - startx4) / count * (i + 1) - (startx4 + (startx3 - startx4) / count * (i + 1) - startx1 - (startx2 - startx1) / count * (i + 1)) / count * (count - 1 - j),
                  starty4 + (starty3 - starty4) / count * (i + 1) - (starty4 + (starty3 - starty4) / count * (i + 1) - starty1 - (starty2 - starty1) / count * (i + 1)) / count * (count - 1 - j),
                  startz4 + (startz3 - startz4) / count * (i + 1) - (startz4 + (startz3 - startz4) / count * (i + 1) - startz1 - (startz2 - startz1) / count * (i + 1)) / count * (count - 1 - j)))
            hireacy.push(new Cesium.Cartesian3(startx4 + (startx3 - startx4) / count * i - (startx4 + (startx3 - startx4) / count * (i) - startx1 - (startx2 - startx1) / count * i) / count * (count - 1 - j), 
                  starty4 + (starty3 - starty4) / count * i - (starty4 + (starty3 - starty4) / count * (i) - starty1 - (starty2 - starty1) / count * i) / count * (count - 1 - j),
                  startz4 + (startz3 - startz4) / count * i - (startz4 + (startz3 - startz4) / count * (i) - startz1 - (startz2 - startz1) / count * i) / count * (count - 1 - j)))
            hireacys.push(hireacy);
           //取出面的8个点坐标,拿点坐标去求高度值
            slopelineposition.push(Cesium.Cartographic.fromDegrees(hireacy[0].x,hireacy[0].y));
            slopelineposition.push(Cesium.Cartographic.fromDegrees((hireacy[0].x+hireacy[1].x)/2,(hireacy[0].y+hireacy[1].y)/2));
            slopelineposition.push(Cesium.Cartographic.fromDegrees(hireacy[1].x,hireacy[1].y));
            slopelineposition.push(Cesium.Cartographic.fromDegrees((hireacy[1].x+hireacy[2].x)/2,(hireacy[1].y+hireacy[2].y)/2));
            slopelineposition.push(Cesium.Cartographic.fromDegrees(hireacy[2].x,hireacy[2].y));
            slopelineposition.push(Cesium.Cartographic.fromDegrees((hireacy[2].x+hireacy[3].x)/2,(hireacy[2].y+hireacy[3].y)/2));
            slopelineposition.push(Cesium.Cartographic.fromDegrees(hireacy[3].x,hireacy[3].y));
            slopelineposition.push(Cesium.Cartographic.fromDegrees((hireacy[3].x+hireacy[0].x)/2,(hireacy[3].y+hireacy[0].y)/2));

        }
    }
    var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, slopelineposition);
    Cesium.when(promise,
    function(updatedPositions) {
       //拿到所有的高度数据
        var heighmm = [];
        var m = 0
        //计算坡度比的次数
         var countcolor1=0;
        var countcolor2=0;
        var countcolor3=0;
        var countcolor4=0;
        var countcolor5=0;
        var countcolor6=0;
        var countcolor7=0;
        for (var k = 0; k < updatedPositions.length / 8; k++) {
                //第一个点与第五个点的坡度
                var slope1=(updatedPositions[m].height-updatedPositions[m+4].height)/(Cesium.Cartesian3.distance(
                Cesium.Cartesian3.fromDegrees(updatedPositions[m].latitude, updatedPositions[m].longitude,updatedPositions[m].height ),
                 Cesium.Cartesian3.fromDegrees(updatedPositions[m+4].latitude, updatedPositions[m+4].longitude,updatedPositions[m+4].height)))
                //第二个点与第六个点的坡度
               var slope2=(updatedPositions[m+1].height-updatedPositions[m+5].height)/(Cesium.Cartesian3.distance(
                Cesium.Cartesian3.fromDegrees(updatedPositions[m+1].latitude, updatedPositions[m+1].longitude, updatedPositions[m+1].height),
                 Cesium.Cartesian3.fromDegrees(updatedPositions[m+5].latitude, updatedPositions[m+5].longitude, updatedPositions[m+5].height)))
               //第三个点与第七个点的坡度
               var slope3=(updatedPositions[m+2].height-updatedPositions[m+6].height)/(Cesium.Cartesian3.distance(
                Cesium.Cartesian3.fromDegrees(updatedPositions[m+2].latitude, updatedPositions[m+2].longitude, updatedPositions[m+2].height),
                 Cesium.Cartesian3.fromDegrees(updatedPositions[m+6].latitude, updatedPositions[m+6].longitude, updatedPositions[m+6].height)))
               //第四个点与第八个点的坡度
               var slope4=(updatedPositions[m+3].height-updatedPositions[m+7].height)/(Cesium.Cartesian3.distance(
                Cesium.Cartesian3.fromDegrees(updatedPositions[m+3].latitude, updatedPositions[m+3].longitude, updatedPositions[m+3].height),
                 Cesium.Cartesian3.fromDegrees(updatedPositions[m+7].latitude, updatedPositions[m+7].longitude, updatedPositions[m+7].height)))
           // console.log("slope1:"+slope1+";slope2:"+slope2+";slope3:"+slope3+";slope4:"+slope4);
            var arrposition=[Math.abs(slope1) ,Math.abs(slope2),Math.abs(slope3),Math.abs(slope4)];//取绝对值
            arrposition.sort();
            var slope= arrposition[3]; // 拿到最大的坡度值  
            var lineposition=[];//画方向线的坐标
            if(slope==Math.abs(slope1)){
                if(slope1>0){
                    lineposition.push( Cesium.Math.toDegrees(updatedPositions[m].longitude),Cesium.Math.toDegrees(updatedPositions[m].latitude), 
                            Cesium.Math.toDegrees(updatedPositions[m+4].longitude),Cesium.Math.toDegrees(updatedPositions[m+4].latitude));
                }else{
                    lineposition.push( 
                            Cesium.Math.toDegrees(updatedPositions[m+4].longitude),Cesium.Math.toDegrees(updatedPositions[m+4].latitude),
                            Cesium.Math.toDegrees(updatedPositions[m].longitude),Cesium.Math.toDegrees(updatedPositions[m].latitude));

                }
            }else if(slope==Math.abs(slope2)){
                if(slope2>0){
                    lineposition.push( Cesium.Math.toDegrees(updatedPositions[m+1].longitude),Cesium.Math.toDegrees(updatedPositions[m+1].latitude), 
                            Cesium.Math.toDegrees(updatedPositions[m+5].longitude),Cesium.Math.toDegrees(updatedPositions[m+5].latitude));
                }else{
                    lineposition.push( 
                            Cesium.Math.toDegrees(updatedPositions[m+5].longitude),Cesium.Math.toDegrees(updatedPositions[m+5].latitude),
                            Cesium.Math.toDegrees(updatedPositions[m+1].longitude),Cesium.Math.toDegrees(updatedPositions[m+1].latitude));
                }
            }else if(slope==Math.abs(slope3)){
                if(slope3>0){
                    lineposition.push( Cesium.Math.toDegrees(updatedPositions[m+2].longitude),Cesium.Math.toDegrees(updatedPositions[m+2].latitude), 
                            Cesium.Math.toDegrees(updatedPositions[m+6].longitude),Cesium.Math.toDegrees(updatedPositions[m+6].latitude));
                }else{
                    lineposition.push( 
                            Cesium.Math.toDegrees(updatedPositions[m+6].longitude),Cesium.Math.toDegrees(updatedPositions[m+6].latitude),
                            Cesium.Math.toDegrees(updatedPositions[m+2].longitude),Cesium.Math.toDegrees(updatedPositions[m+2].latitude));
                }
            }else if(slope==Math.abs(slope4)){
                if(slope4>0){
                    lineposition.push( Cesium.Math.toDegrees(updatedPositions[m+3].longitude),Cesium.Math.toDegrees(updatedPositions[m+3].latitude), 
                            Cesium.Math.toDegrees(updatedPositions[m+7].longitude),Cesium.Math.toDegrees(updatedPositions[m+7].latitude));
                }else{
                    lineposition.push( 
                            Cesium.Math.toDegrees(updatedPositions[m+7].longitude),Cesium.Math.toDegrees(updatedPositions[m+7].latitude),
                            Cesium.Math.toDegrees(updatedPositions[m+3].longitude),Cesium.Math.toDegrees(updatedPositions[m+3].latitude));
                }
            }
            slope=  (Math.abs(slope1) +Math.abs(slope2)+Math.abs(slope3)+Math.abs(slope4))/4; //四个坡度值大小有的差值特别大,这里取的平均值用来配置颜色
            // console.log(slope);
            if (0 <= slope && slope < 0.29) {
                slopecolor = '#ff9090'
                countcolor1++;
            } else if (0.29 <= slope && slope < 0.5) {
                slopecolor = '#ff8080'
                countcolor2++;
            } else if (0.5 <= slope && slope < Math.sqrt(2) / 2) {
                slopecolor = '#ff7070'
                countcolor3++;
            } else if (Math.sqrt(2) / 2 <= slope && slope < 0.87) {
                slopecolor = '#ff6060'
                countcolor4++;
            } else if (0.87 <= slope && slope < 0.91) {
                slopecolor = '#ff5050'
                countcolor5++;
            } else if (0.91 <= slope && slope < 0.95) {
                slopecolor = '#ff4040'
                countcolor6++;
            } else  {
                slopecolor = '#ff3030'
                countcolor7++;
            }
            viewer.entities.add({
                        type:'drawSloperectange',
                        rectangle: {
                            coordinates:  Cesium.Rectangle.fromDegrees(
                                Cesium.Math.toDegrees(updatedPositions[m].longitude), Cesium.Math.toDegrees(updatedPositions[m].latitude),
                                Cesium.Math.toDegrees(updatedPositions[m+4].longitude),Cesium.Math.toDegrees(updatedPositions[m+4].latitude))  
                            ,
                            material:  Cesium.Color.fromCssColorString(slopecolor)
							
                        },
						polyline: {
                            clampToGround: true,
                            positions:  Cesium.Cartesian3.fromDegreesArray(lineposition), 
                            material:new Cesium.PolylineArrowMaterialProperty(Cesium.Color.fromCssColorString("#ff9090")),// Cesium.Color.BLUE.withAlpha(0.5) ,
                            width: 8,
                            distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, updatedPositions[m+4].height+4500)
                        },
                    }
                );
             m += 8;
        }
              var contents="<div class='slope_layer'><div> <div style='height:19px;background-color:#ff9090; width: 64px;float: left;'> </div><span >"+(countcolor1/(updatedPositions.length / 8)*100).toFixed(2)+"% (<0.29)</span></div>";
              contents+=" <div  style='clear: both;'><div style='height:19px;background-color:#ff8080 ; width: 64px;float: left;'></div><span >  "+(countcolor2/(updatedPositions.length / 8)*100).toFixed(2)+"%(<0.5)</span></div>";
              contents+="<div   style='clear: both;'><div  style='height:19px;background-color:#ff7070;width: 64px;float: left;'> </div><span >"+(countcolor3/(updatedPositions.length / 8)*100).toFixed(2)+"%(<0.7)</span></div>";
              contents+=" <div  style='clear: both;'><div style='height:19px;background-color:#ff6060;width: 64px;float: left;'> </div><span >"+(countcolor4/(updatedPositions.length / 8)*100).toFixed(2)+"%(<0.87)</span></div>";
              contents+=" <div  style='clear: both;'><div style='height:19px;background-color:#ff5050;width: 64px;float: left;'> </div><span > "+(countcolor5/(updatedPositions.length / 8)*100).toFixed(2)+"%(<0.91)</span></div>";
              contents+=" <div  style='clear: both;'><div style='height:19px;background-color:#ff4040;width: 64px;float: left;'> </div><span >"+(countcolor6/(updatedPositions.length / 8)*100).toFixed(2)+"%(<0.95)</span></div>";
              contents+=" <div  style='clear: both;'><div style='height:19px;background-color:#ff3030;width: 64px;float: left;'> </div><span > "+(countcolor7/(updatedPositions.length / 8)*100).toFixed(2)+"%(<1)</span></div></div>";
               layer.closeAll();

              
                layer.open({
                    type: 1,
                    offset: ["500px", "1200px"],
                    area: ['260px', '179px'],
                    title: "坡度分析信息"
                        ,
                    content:contents 
                        ,
                    btnAlign: 'c' //按钮居中
                        ,
                    shade: 0 //不显示遮罩
                        ,
                    cancel: function(index) {
                        layer.close(index);
                    }
                });  
       
    })

}

这里放两张图片效果

 

这个功能废了我好长时间,在此把代码贴上,如果帮助到你,可以

下个软件免费领取购物券(IOS 需要激活,网站有激活码):365淘券吧  http://www.365tqb.com

hahahahahahahahahaha

### 回答1: Cesium坡度坡向分析是一种用Cesium三维地球可视化技术实现的地形分析方法。该技术在地形分析、土地利用、环境资源管理等领域有着广泛的应用。 通过该技术,可以获取到地表上的坡度坡向信息,并绘制出三维坡度坡向图。其中,坡度表示地面对水平面的倾斜程度,坡向则表示地面倾斜方向。这些信息对于山区、河流、农业、城市规划等领域都有着重要的意义。 在农业方面,坡度坡向分析可以帮助农民选择合适的种植方式,比如在陡峭地形上采用梯田种植法,以减少水土流失和剥蚀等问题。在城市规划中,坡度坡向信息可以作为选址、建筑设计等方面的参考,以确保城市建筑在合适的位置建设,对城市生态环境造成最小的影响。 总的来说,Cesium坡度坡向分析技术是现代化生产和可持续发展的必要手段。它为环境保护、资源管理和生态平衡的实现提供了重要的科学依据。 ### 回答2: Cesium是一种基于Web的GIS工具,可用于地形分析坡度坡向分析坡度是指地表上某一点的高度变化率,而坡向则是指地图上某一点朝向的方向。在地形分析中,坡度坡向被广泛用于土地利用规划、水资源管理和森林管理等领域。 Cesium坡度坡向分析功能可以帮助用户在地图上显示出坡度坡向,从而更好地了解地形特征。该功能通过计算地图上每个点相对于其周围的高度差来确定坡度。对于每个点,Cesium使用特定的色阶来标识其坡度等级。较小的坡度通常由绿色或蓝色表示,而较大的坡度则通常由红色或橙色表示。 坡向则与坡度相关,它表示地面的倾斜方向。Cesium使用箭头来表示每个点的坡向,箭头指向相对较陡的方向。它们的长度表示速度,它们的颜色表示方向。 总之,Cesium坡度坡向分析具有广泛的应用领域,包括环境评估、地表水管理、土地规划和土地利用等。使用这一工具可以更好地了解地表特征,预测自然风险和管理自然资源。 ### 回答3: Cesium坡度坡向分析是一种通过计算地形表面倾斜角度和方向的方法,评估地形的可持续性和土地利用。该技术使用Cesium的3D浏览器来分析地形数据,并可视化结果。在分析中,通过计算每个地形点的坡度坡向来确定地形的属性。这些属性包括坡度坡向,基于这些属性,可以确定不同地形的吸水能力,土壤侵蚀程度和植被生长适宜程度等信息。 Cesium坡度坡向分析技术的应用领域广泛,包括农业、林业、城市规划和环境保护等。例如,在农业方面,该技术可用于帮助评估土地的可耕性,确定农作物种植的最佳位置和植物的生长环境。在林业方面,这项技术可用于评估森林资源,确定各种树种的适宜种植位置,并估测森林的生物量和碳储存量。在城市规划中,该技术可用于确定最佳建筑位置和城市基础设施的布局,提高城市规划的效率和可持续性。在环境保护方面,该技术可用于评估土地的荒漠化程度、土壤侵蚀程度和水源涵养能力,为环境保护提供重要的科学依据。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值