Cesium 三角測量(水平距離,直線距離,高度差)

原理就是先獲取兩個點座標,比較兩個點高度值,確認三角形向上或向下繪製,獲取第二個點座標加上最高點的高程值作爲第三點座標,用線段繪製,額外添加三個label作爲信息展示。

配合https://blog.csdn.net/qq_40288344/article/details/79012572座標拾取使用

function T_Triangle() {
    let trianArr=[];
    let distanceLineNum=0;
    let XLine;
    let X,Y,H;
    handlerT = new Cesium.ScreenSpaceEventHandler(scene.canvas);
    handlerT.setInputAction(function(movement) {
        distanceLineNum++;
        if(distanceLineNum === 1) {
            trianArr.push(lon, lat, MouseHeight);
            XLine = viewer.entities.add({
                id:'triangleLine',
                polyline: {
                    //由回調函數進行懶惰評估
                    positions: new Cesium.CallbackProperty(function () {
                        if (MouseHeight>trianArr[2]){
                            return Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2], trianArr[0], trianArr[1], MouseHeight, A, B, MouseHeight, trianArr[0], trianArr[1], trianArr[2]]);
                        }else{
                            return Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2], A, B, trianArr[2], A, B, MouseHeight, trianArr[0], trianArr[1], trianArr[2]]);
                        }
                        //返回給定一組經度,緯度和高度值的Cartesian3位置數組,其中經度和緯度以度爲單位給出。/Cartesian3返回笛卡爾座標
                        //true當回調函數每次返回相同的值時,如果值發生變化,則爲false
                    }, false),
                    arcType: Cesium.ArcType.NONE,
                    width: 2,
                    material: new Cesium.PolylineOutlineMaterialProperty({
                        color: Cesium.Color.YELLOW
                    }),
                    depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
                        color: Cesium.Color.RED
                    })
                }
            });
        }else{
            distanceLineNum=0;
            trianArr.push(lon,lat,MouseHeight);
            handlerT.destroy();
            viewer.entities.removeById('triangleLine');
            XLine = viewer.entities.add({
                id:'triangleLine',
                polyline:{
                    positions:MouseHeight>trianArr[2]?new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2], trianArr[0], trianArr[1], trianArr[5],trianArr[3], trianArr[4], trianArr[5], trianArr[0], trianArr[1], trianArr[2]]): new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0], trianArr[1], trianArr[2], trianArr[3], trianArr[4], trianArr[5],trianArr[3], trianArr[4], trianArr[2], trianArr[0], trianArr[1], trianArr[2]]),
                    arcType: Cesium.ArcType.NONE,
                    width: 2,
                    material: new Cesium.PolylineOutlineMaterialProperty({
                        color: Cesium.Color.YELLOW
                    }),
                    depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
                        color: Cesium.Color.RED
                    })
                }
            });

            // 空間
            let lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0],trianArr[1]),Cesium.Cartesian3.fromDegrees(trianArr[3],trianArr[4])).toFixed(2);
            //高度
            let height = Math.abs(trianArr[2]-trianArr[5]).toFixed(2);
            //直線距離
            let strLine =  (Math.sqrt(Math.pow(lineDistance,2) + Math.pow(height,2))).toFixed(2);
            X = viewer.entities.add({
                id:'lineX',
                position:Cesium.Cartesian3.fromDegrees((trianArr[0]+trianArr[3])/2,(trianArr[1]+trianArr[4])/2, Math.max(trianArr[2],trianArr[5])),
                label:{
                    text: '空間距離:'+lineDistance+'米',
                    translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
                    font: '45px 楷體',
                    fillColor: Cesium.Color.WHITE,
                    outlineColor: Cesium.Color.BLACK,
                    style:Cesium.LabelStyle.FILL_AND_OUTLINE,
                    outlineWidth: 3,
                    disableDepthTestDistance : 1000000000,
                    scale:0.5,
                    pixelOffset:new Cesium.Cartesian2(0, -10),
                    backgroundColor:new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
                    backgroundPadding:new Cesium.Cartesian2(10, 10),
                    verticalOrigin:Cesium.VerticalOrigin.BOTTOM
                }
            });
            H = viewer.entities.add({
                id:'lineZ',
                position:MouseHeight>trianArr[2]?Cesium.Cartesian3.fromDegrees(trianArr[0],trianArr[1],(trianArr[2]+trianArr[5])/2):Cesium.Cartesian3.fromDegrees(trianArr[3],trianArr[4],(trianArr[2]+trianArr[5])/2),
                label:{
                    text: '高度差:'+height+'米',
                    translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
                    font: '45px 楷體',
                    fillColor: Cesium.Color.WHITE,
                    outlineColor: Cesium.Color.BLACK,
                    style:Cesium.LabelStyle.FILL_AND_OUTLINE,
                    outlineWidth: 3,
                    disableDepthTestDistance : 1000000000,
                    scale:0.5,
                    pixelOffset:new Cesium.Cartesian2(0, -10),
                    backgroundColor:new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
                    backgroundPadding:new Cesium.Cartesian2(10, 10),
                    verticalOrigin:Cesium.VerticalOrigin.BOTTOM
                }
            });
            Y = viewer.entities.add({
                id:'lineY',
                position:Cesium.Cartesian3.fromDegrees((trianArr[0]+trianArr[3])/2,(trianArr[1]+trianArr[4])/2,(trianArr[2]+trianArr[5])/2),
                label:{
                    text: '直線距離:'+strLine+'米',
                    translucencyByDistance: new Cesium.NearFarScalar(1.5e2, 2.0, 1.5e5, 0),
                    font: '45px 楷體',
                    fillColor: Cesium.Color.WHITE,
                    outlineColor: Cesium.Color.BLACK,
                    style:Cesium.LabelStyle.FILL_AND_OUTLINE,
                    outlineWidth: 3,
                    disableDepthTestDistance : 1000000000,
                    scale:0.5,
                    pixelOffset:new Cesium.Cartesian2(0, -10),
                    backgroundColor:new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 0.7)"),
                    backgroundPadding:new Cesium.Cartesian2(10, 10),
                    verticalOrigin:Cesium.VerticalOrigin.BOTTOM
                }
            });
        }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章