mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-03 16:54:16 +00:00 
			
		
		
		
	
		
			
	
	
		
			1348 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			1348 lines
		
	
	
		
			60 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						|||
| 
								 | 
							
								 * @class {MeasureTool} 测量工具
							 | 
						|||
| 
								 | 
							
								 * @param {viewer} viewer 三维视图
							 | 
						|||
| 
								 | 
							
								 * @param {target} string 测量工具放置的div的id
							 | 
						|||
| 
								 | 
							
								 * @param {classname} string 样式名
							 | 
						|||
| 
								 | 
							
								 * @param {terrainProvider} terrain 地形
							 | 
						|||
| 
								 | 
							
								 * @param {show} bool 是否显示界面
							 | 
						|||
| 
								 | 
							
								 * */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								class MeasureTool {
							 | 
						|||
| 
								 | 
							
								    constructor(option) {
							 | 
						|||
| 
								 | 
							
								        this.viewer = option.viewer;
							 | 
						|||
| 
								 | 
							
								        this.terrainProvider = option.terrainProvider;
							 | 
						|||
| 
								 | 
							
								        this.options = option;
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        if (option.show !== false) {
							 | 
						|||
| 
								 | 
							
								            if (option.target) {
							 | 
						|||
| 
								 | 
							
								                this.dom = document.getElementById(option.target);
							 | 
						|||
| 
								 | 
							
								                this.dom.classList.add("measureTool");
							 | 
						|||
| 
								 | 
							
								                if (option.classname) {
							 | 
						|||
| 
								 | 
							
								                    this.dom.classList.add(option.classname);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                var div = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								                div.className = "measureTool measureTool_" + (option.classname ? " " + option.classname : "");
							 | 
						|||
| 
								 | 
							
								                document.body.appendChild(div);
							 | 
						|||
| 
								 | 
							
								                this.dom = div;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //空间测量距离
							 | 
						|||
| 
								 | 
							
								            var btnDistance = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnDistance.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnDistance.innerHTML = '空间距离';
							 | 
						|||
| 
								 | 
							
								            btnDistance.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('空间距离');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnDistance);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //地表测量距离
							 | 
						|||
| 
								 | 
							
								            var btnGroundDistance = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnGroundDistance.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnGroundDistance.innerHTML = '地表距离';
							 | 
						|||
| 
								 | 
							
								            btnGroundDistance.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('地表距离');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnGroundDistance);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //地表测量面积
							 | 
						|||
| 
								 | 
							
								            var btnArea = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnArea.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnArea.innerHTML = '地表面积';
							 | 
						|||
| 
								 | 
							
								            btnArea.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('地表面积');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnArea);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //高度差
							 | 
						|||
| 
								 | 
							
								            var btnAltitude = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnAltitude.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnAltitude.innerHTML = '高度差';
							 | 
						|||
| 
								 | 
							
								            btnAltitude.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('高度差');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnAltitude);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //三角测量
							 | 
						|||
| 
								 | 
							
								            var btnTriangle = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnTriangle.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnTriangle.innerHTML = '三角测量';
							 | 
						|||
| 
								 | 
							
								            btnTriangle.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('三角测量');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnTriangle);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //方位角
							 | 
						|||
| 
								 | 
							
								            var btnAngle = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnAngle.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnAngle.innerHTML = '方位角';
							 | 
						|||
| 
								 | 
							
								            btnAngle.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                this.classList.add('selItembox1');
							 | 
						|||
| 
								 | 
							
								                me.btnclick('方位角');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnAngle);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //清除结果
							 | 
						|||
| 
								 | 
							
								            var btnClear = document.createElement('div');
							 | 
						|||
| 
								 | 
							
								            btnClear.className = "measureItem";
							 | 
						|||
| 
								 | 
							
								            btnClear.innerHTML = '清除结果';
							 | 
						|||
| 
								 | 
							
								            btnClear.onclick = function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick('清除结果');
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            this.dom.appendChild(btnClear);
							 | 
						|||
| 
								 | 
							
								            //
							 | 
						|||
| 
								 | 
							
								            // //事件
							 | 
						|||
| 
								 | 
							
								            document.onclick = function (e) {
							 | 
						|||
| 
								 | 
							
								                var len = document.querySelectorAll('.selItembox1').length;
							 | 
						|||
| 
								 | 
							
								                if (e.target.className !== "" && e.target.className.indexOf("selItembox1") >= 0 && len == 1) {
							 | 
						|||
| 
								 | 
							
								                    return
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                if (len > 0) {
							 | 
						|||
| 
								 | 
							
								                    if (len > 1) {
							 | 
						|||
| 
								 | 
							
								                      var all = document.querySelectorAll(".selItembox1");
							 | 
						|||
| 
								 | 
							
								                      for (var a = 0; a < all.length; a++) {
							 | 
						|||
| 
								 | 
							
								                        if (all[a] !== e.target) {
							 | 
						|||
| 
								 | 
							
								                          all[a].classList.remove('selItembox1');
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                      }
							 | 
						|||
| 
								 | 
							
								                    } else {
							 | 
						|||
| 
								 | 
							
								                      document.querySelector('.selItembox1').classList.remove('selItembox1');
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        this.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								        me.viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        this.measureIds = [];
							 | 
						|||
| 
								 | 
							
								        return {
							 | 
						|||
| 
								 | 
							
								            name: "测量",
							 | 
						|||
| 
								 | 
							
								            measureLineSpace: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("空间距离");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            groundMeasureLineSpace: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("地表距离");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            measureAreaSpace: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("地表面积");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            altitude: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("高度差");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            Triangle: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("三角测量");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            measureAngle: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("方位角");
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            Clear: function () {
							 | 
						|||
| 
								 | 
							
								                me.btnclick("清除结果")
							 | 
						|||
| 
								 | 
							
								            },
							 | 
						|||
| 
								 | 
							
								            finishMeasure: function () {
							 | 
						|||
| 
								 | 
							
								                me._finishMeasure();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //点击事件
							 | 
						|||
| 
								 | 
							
								    btnclick(type) {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (type != "清除结果") {
							 | 
						|||
| 
								 | 
							
								            if (me.bMeasuring)
							 | 
						|||
| 
								 | 
							
								                if (me.handler && !me.handler.isDestroyed())
							 | 
						|||
| 
								 | 
							
								                    me.handler = me.handler && me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								            // return;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        switch (type) {
							 | 
						|||
| 
								 | 
							
								            case "空间距离":
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._measureLineSpace();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "地表距离":
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._groundMeasureLineSpace();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "地表面积":
							 | 
						|||
| 
								 | 
							
								             
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._measureAreaSpace();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "高度差":
							 | 
						|||
| 
								 | 
							
								              
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._altitude();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "三角测量":
							 | 
						|||
| 
								 | 
							
								                
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._Triangle();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "方位角":
							 | 
						|||
| 
								 | 
							
								               
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = true;
							 | 
						|||
| 
								 | 
							
								                me.viewer._container.style.cursor = "crosshair";
							 | 
						|||
| 
								 | 
							
								                me._measureAngle();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case "清除结果":
							 | 
						|||
| 
								 | 
							
								                //删除事先记录的id
							 | 
						|||
| 
								 | 
							
								                for (var jj = 0; jj < me.measureIds.length; jj++) {
							 | 
						|||
| 
								 | 
							
								                    me.viewer.entities.removeById(me.measureIds[jj]);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                me.measureIds.length = 0;
							 | 
						|||
| 
								 | 
							
								                if (me.handler && !me.handler.isDestroyed())
							 | 
						|||
| 
								 | 
							
								                    me.handler = me.handler && me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    _finishMeasure() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        me.btnclick("清除结果")
							 | 
						|||
| 
								 | 
							
								        me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								        me.viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        document.getElementsByClassName("measureTool")[0].parentNode.removeChild(document.getElementsByClassName("measureTool")[0]);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //空间距离测量
							 | 
						|||
| 
								 | 
							
								    _measureLineSpace() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
							 | 
						|||
| 
								 | 
							
								        var positions = [];
							 | 
						|||
| 
								 | 
							
								        var poly = null;
							 | 
						|||
| 
								 | 
							
								        var distance = 0;
							 | 
						|||
| 
								 | 
							
								        var cartesian = null;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint;
							 | 
						|||
| 
								 | 
							
								        //监听移动事件
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            //移动结束位置
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //判断点是否在画布上
							 | 
						|||
| 
								 | 
							
								            if (Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                if (positions.length >= 2) {
							 | 
						|||
| 
								 | 
							
								                    if (!Cesium.defined(poly)) {
							 | 
						|||
| 
								 | 
							
								                        //画线
							 | 
						|||
| 
								 | 
							
								                        poly = new PolyLinePrimitive(positions);
							 | 
						|||
| 
								 | 
							
								                    } else {
							 | 
						|||
| 
								 | 
							
								                        positions.pop();
							 | 
						|||
| 
								 | 
							
								                        // cartesian.y += (1 + Math.random());
							 | 
						|||
| 
								 | 
							
								                        positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								        //监听单击事件
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            if (Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                if (positions.length == 0) {
							 | 
						|||
| 
								 | 
							
								                    positions.push(cartesian.clone());
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                var distance_add = parseFloat(getSpaceDistance(positions));
							 | 
						|||
| 
								 | 
							
								                distance += distance_add;
							 | 
						|||
| 
								 | 
							
								                //在三维场景中添加Label
							 | 
						|||
| 
								 | 
							
								                var textDisance = ((distance > 1000) ? (distance / 1000).toFixed(3) + '千米' : distance.toFixed(2) + '米') + "\n(+" + (distance_add > 1000 ? (distance_add / 1000).toFixed(3) + '千米' : distance_add + '米') + ")"
							 | 
						|||
| 
								 | 
							
								                // var textDisance = distance + "米";
							 | 
						|||
| 
								 | 
							
								                // if (distance > 1000) {
							 | 
						|||
| 
								 | 
							
								                //     textDisance = (parseFloat(distance) / 1000).toFixed(3) + "千米";
							 | 
						|||
| 
								 | 
							
								                // }
							 | 
						|||
| 
								 | 
							
								                floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                    name: '空间直线距离',
							 | 
						|||
| 
								 | 
							
								                    position: positions[positions.length - 1],
							 | 
						|||
| 
								 | 
							
								                    point: {
							 | 
						|||
| 
								 | 
							
								                        pixelSize: 5,
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                        outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                        outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        heightReference: Cesium.HeightReference.NONE
							 | 
						|||
| 
								 | 
							
								                    },
							 | 
						|||
| 
								 | 
							
								                    label: {
							 | 
						|||
| 
								 | 
							
								                        text: textDisance,
							 | 
						|||
| 
								 | 
							
								                        font: '18px sans-serif',
							 | 
						|||
| 
								 | 
							
								                        fillColor: Cesium.Color.CHARTREUSE,
							 | 
						|||
| 
								 | 
							
								                        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
							 | 
						|||
| 
								 | 
							
								                        outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
							 | 
						|||
| 
								 | 
							
								                        pixelOffset: new Cesium.Cartesian2(20, -20),
							 | 
						|||
| 
								 | 
							
								                        disableDepthTestDistance: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                        heightReference: Cesium.HeightReference.NONE
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								        //监听双击事件
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy(); //关闭事件句柄
							 | 
						|||
| 
								 | 
							
								            positions.pop(); //最后一个点无效
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //绘线效果1
							 | 
						|||
| 
								 | 
							
								        var PolyLinePrimitive = (function () {
							 | 
						|||
| 
								 | 
							
								            function _(positions) {
							 | 
						|||
| 
								 | 
							
								                this.options = {
							 | 
						|||
| 
								 | 
							
								                    name: '直线',
							 | 
						|||
| 
								 | 
							
								                    polyline: {
							 | 
						|||
| 
								 | 
							
								                        show: true,
							 | 
						|||
| 
								 | 
							
								                        positions: [],
							 | 
						|||
| 
								 | 
							
								                        arcType: Cesium.ArcType.NONE,
							 | 
						|||
| 
								 | 
							
								                        // material: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        //     color: Cesium.Color.CHARTREUSE
							 | 
						|||
| 
								 | 
							
								                        // }),
							 | 
						|||
| 
								 | 
							
								                        material: Cesium.Color.CHARTREUSE,
							 | 
						|||
| 
								 | 
							
								                        // depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        //     color: Cesium.Color.RED
							 | 
						|||
| 
								 | 
							
								                        // }),
							 | 
						|||
| 
								 | 
							
								                        width: 2
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                this.positions = positions;
							 | 
						|||
| 
								 | 
							
								                this._init();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            _.prototype._init = function () {
							 | 
						|||
| 
								 | 
							
								                var _self = this;
							 | 
						|||
| 
								 | 
							
								                var _update = function () {
							 | 
						|||
| 
								 | 
							
								                    return _self.positions;
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                //实时更新polyline.positions
							 | 
						|||
| 
								 | 
							
								                this.options.polyline.positions = new Cesium.CallbackProperty(_update, false);
							 | 
						|||
| 
								 | 
							
								                var et = viewer.entities.add(this.options);
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(et.id);
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return _;
							 | 
						|||
| 
								 | 
							
								        })();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //空间两点距离计算函数
							 | 
						|||
| 
								 | 
							
								        function getSpaceDistance(positions) {
							 | 
						|||
| 
								 | 
							
								            var distance_ = 0;
							 | 
						|||
| 
								 | 
							
								            if (positions.length > 2) {
							 | 
						|||
| 
								 | 
							
								                var point1cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
							 | 
						|||
| 
								 | 
							
								                var point2cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
							 | 
						|||
| 
								 | 
							
								                /**根据经纬度计算出距离**/
							 | 
						|||
| 
								 | 
							
								                var geodesic = new Cesium.EllipsoidGeodesic();
							 | 
						|||
| 
								 | 
							
								                geodesic.setEndPoints(point1cartographic, point2cartographic);
							 | 
						|||
| 
								 | 
							
								                var s = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								                //console.log(Math.sqrt(Math.pow(distance_, 2) + Math.pow(endheight, 2)));
							 | 
						|||
| 
								 | 
							
								                //返回两点之间的距离
							 | 
						|||
| 
								 | 
							
								                s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
							 | 
						|||
| 
								 | 
							
								                distance_ = distance_ + s;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return distance_.toFixed(2);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //贴地测量距离函数
							 | 
						|||
| 
								 | 
							
								    _groundMeasureLineSpace() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        var terrainProvider = this.terrainProvider;
							 | 
						|||
| 
								 | 
							
								        viewer.scene.globe.depthTestAgainstTerrain = true;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
							 | 
						|||
| 
								 | 
							
								        var positions = [];
							 | 
						|||
| 
								 | 
							
								        var poly = null;
							 | 
						|||
| 
								 | 
							
								        // var tooltip = document.getElementById("toolTip");
							 | 
						|||
| 
								 | 
							
								        var distance = 0;
							 | 
						|||
| 
								 | 
							
								        var cartesian = null;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint;
							 | 
						|||
| 
								 | 
							
								        // tooltip.style.display = "block";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.left = movement.endPosition.x + 3 + "px";
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.top = movement.endPosition.y - 25 + "px";
							 | 
						|||
| 
								 | 
							
								            // tooltip.innerHTML = '<p>单击开始,右击结束</p>';
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                let ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            let p = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								            p.height = viewer.scene.sampleHeight(p);
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.globe.ellipsoid.cartographicToCartesian(p);
							 | 
						|||
| 
								 | 
							
								            //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (positions.length >= 2) {
							 | 
						|||
| 
								 | 
							
								                if (!Cesium.defined(poly)) {
							 | 
						|||
| 
								 | 
							
								                    poly = new PolyLinePrimitive(positions);
							 | 
						|||
| 
								 | 
							
								                } else {
							 | 
						|||
| 
								 | 
							
								                    positions.pop();
							 | 
						|||
| 
								 | 
							
								                    // cartesian.y += (1 + Math.random());
							 | 
						|||
| 
								 | 
							
								                    positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                // console.log("distance: " + distance);
							 | 
						|||
| 
								 | 
							
								                // tooltip.innerHTML='<p>'+distance+'米</p>';
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.display = "none";
							 | 
						|||
| 
								 | 
							
								            // cartesian = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                let ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            let p = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								            p.height = viewer.scene.sampleHeight(p);
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.globe.ellipsoid.cartographicToCartesian(p);
							 | 
						|||
| 
								 | 
							
								            if (positions.length == 0) {
							 | 
						|||
| 
								 | 
							
								                positions.push(cartesian.clone());
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								            getSpaceDistance(positions);
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy(); //关闭事件句柄
							 | 
						|||
| 
								 | 
							
								            positions.pop(); //最后一个点无效
							 | 
						|||
| 
								 | 
							
								            // viewer.entities.remove(floatingPoint);
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.display = "none";
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var PolyLinePrimitive = (function () {
							 | 
						|||
| 
								 | 
							
								            function _(positions) {
							 | 
						|||
| 
								 | 
							
								                this.options = {
							 | 
						|||
| 
								 | 
							
								                    name: '直线',
							 | 
						|||
| 
								 | 
							
								                    polyline: {
							 | 
						|||
| 
								 | 
							
								                        show: true,
							 | 
						|||
| 
								 | 
							
								                        positions: [],
							 | 
						|||
| 
								 | 
							
								                        material: Cesium.Color.GOLD,
							 | 
						|||
| 
								 | 
							
								                        width: 2,
							 | 
						|||
| 
								 | 
							
								                        clampToGround: true
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                this.positions = positions;
							 | 
						|||
| 
								 | 
							
								                this._init();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _.prototype._init = function () {
							 | 
						|||
| 
								 | 
							
								                var _self = this;
							 | 
						|||
| 
								 | 
							
								                var _update = function () {
							 | 
						|||
| 
								 | 
							
								                    return _self.positions;
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                //实时更新polyline.positions
							 | 
						|||
| 
								 | 
							
								                this.options.polyline.positions = new Cesium.CallbackProperty(_update, false);
							 | 
						|||
| 
								 | 
							
								                var et = viewer.entities.add(this.options);
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(et.id);
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return _;
							 | 
						|||
| 
								 | 
							
								        })();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //空间两点距离计算函数
							 | 
						|||
| 
								 | 
							
								        function getSpaceDistance(positions) {
							 | 
						|||
| 
								 | 
							
								            var distance_ = 0;
							 | 
						|||
| 
								 | 
							
								            if (positions.length > 2) {
							 | 
						|||
| 
								 | 
							
								                var positions_ = [];
							 | 
						|||
| 
								 | 
							
								                var sp = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
							 | 
						|||
| 
								 | 
							
								                var ep = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
							 | 
						|||
| 
								 | 
							
								                var geodesic = new Cesium.EllipsoidGeodesic();
							 | 
						|||
| 
								 | 
							
								                geodesic.setEndPoints(sp, ep);
							 | 
						|||
| 
								 | 
							
								                var s = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								                positions_.push(sp);
							 | 
						|||
| 
								 | 
							
								                var num = parseInt((s / 100).toFixed(0));
							 | 
						|||
| 
								 | 
							
								                num = num > 200 ? 200 : num;
							 | 
						|||
| 
								 | 
							
								                num = num < 20 ? 20 : num;
							 | 
						|||
| 
								 | 
							
								                for (var i = 1; i < num; i++) {
							 | 
						|||
| 
								 | 
							
								                    var res = geodesic.interpolateUsingSurfaceDistance(s / num * i, new Cesium.Cartographic());
							 | 
						|||
| 
								 | 
							
								                    res.height = viewer.scene.sampleHeight(res);
							 | 
						|||
| 
								 | 
							
								                    positions_.push(res);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                positions_.push(ep);
							 | 
						|||
| 
								 | 
							
								                // var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions_);
							 | 
						|||
| 
								 | 
							
								                // Cesium.when(promise, function (updatedPositions) {
							 | 
						|||
| 
								 | 
							
								                for (var ii = 0; ii < positions_.length - 1; ii++) {
							 | 
						|||
| 
								 | 
							
								                    geodesic.setEndPoints(positions_[ii], positions_[ii + 1]);
							 | 
						|||
| 
								 | 
							
								                    var d = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								                    distance_ = Math.sqrt(Math.pow(d, 2) + Math.pow(positions_[ii + 1].height - positions_[ii]
							 | 
						|||
| 
								 | 
							
								                        .height,
							 | 
						|||
| 
								 | 
							
								                        2)) + distance_;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                //在三维场景中添加Label
							 | 
						|||
| 
								 | 
							
								                var distance_add = parseFloat(distance_.toFixed(2));
							 | 
						|||
| 
								 | 
							
								                distance += distance_add;
							 | 
						|||
| 
								 | 
							
								                var textDisance = ((distance > 1000) ? (distance / 1000).toFixed(3) + '千米' : distance.toFixed(2) + '米') + "\n(+" + (distance_add > 1000 ? (distance_add / 1000).toFixed(3) + '千米' : distance_add + '米') + ")"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                // var textDisance = distance + "米";
							 | 
						|||
| 
								 | 
							
								                // if (distance > 1000) {
							 | 
						|||
| 
								 | 
							
								                //     textDisance = (distance / 1000).toFixed(3) + "千米";
							 | 
						|||
| 
								 | 
							
								                // }
							 | 
						|||
| 
								 | 
							
								                floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                    name: '空间直线距离',
							 | 
						|||
| 
								 | 
							
								                    position: positions[positions.length - 1],
							 | 
						|||
| 
								 | 
							
								                    point: {
							 | 
						|||
| 
								 | 
							
								                        pixelSize: 5,
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                        outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                        outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        // disableDepthTestDistance: Number.POSITIVE_INFINITY
							 | 
						|||
| 
								 | 
							
								                    },
							 | 
						|||
| 
								 | 
							
								                    label: {
							 | 
						|||
| 
								 | 
							
								                        text: textDisance,
							 | 
						|||
| 
								 | 
							
								                        font: '18px sans-serif',
							 | 
						|||
| 
								 | 
							
								                        fillColor: Cesium.Color.GOLD,
							 | 
						|||
| 
								 | 
							
								                        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
							 | 
						|||
| 
								 | 
							
								                        outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
							 | 
						|||
| 
								 | 
							
								                        disableDepthTestDistance: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                        pixelOffset: new Cesium.Cartesian2(20, -20),
							 | 
						|||
| 
								 | 
							
								                        // disableDepthTestDistance: Number.POSITIVE_INFINITY
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								                // });
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        //空间两点距离计算函数
							 | 
						|||
| 
								 | 
							
								        function getSpaceDistance_(positions) {
							 | 
						|||
| 
								 | 
							
								            var distance_ = 0;
							 | 
						|||
| 
								 | 
							
								            if (positions.length > 2) {
							 | 
						|||
| 
								 | 
							
								                var positions_ = [];
							 | 
						|||
| 
								 | 
							
								                var sp = Cesium.Cartographic.fromCartesian(positions[positions.length - 3]);
							 | 
						|||
| 
								 | 
							
								                var ep = Cesium.Cartographic.fromCartesian(positions[positions.length - 2]);
							 | 
						|||
| 
								 | 
							
								                var geodesic = new Cesium.EllipsoidGeodesic();
							 | 
						|||
| 
								 | 
							
								                geodesic.setEndPoints(sp, ep);
							 | 
						|||
| 
								 | 
							
								                var s = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								                positions_.push(sp);
							 | 
						|||
| 
								 | 
							
								                var num = parseInt((s / 100).toFixed(0));
							 | 
						|||
| 
								 | 
							
								                num = num > 200 ? 200 : num;
							 | 
						|||
| 
								 | 
							
								                num = num < 20 ? 20 : num;
							 | 
						|||
| 
								 | 
							
								                for (var i = 1; i < num; i++) {
							 | 
						|||
| 
								 | 
							
								                    var res = geodesic.interpolateUsingSurfaceDistance(s / num * i, new Cesium.Cartographic());
							 | 
						|||
| 
								 | 
							
								                    positions_.push(res);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                positions_.push(ep);
							 | 
						|||
| 
								 | 
							
								                var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions_);
							 | 
						|||
| 
								 | 
							
								                Cesium.when(promise, function (updatedPositions) {
							 | 
						|||
| 
								 | 
							
								                    for (var ii = 0; ii < positions_.length - 1; ii++) {
							 | 
						|||
| 
								 | 
							
								                        geodesic.setEndPoints(positions_[ii], positions_[ii + 1]);
							 | 
						|||
| 
								 | 
							
								                        var d = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								                        distance_ = Math.sqrt(Math.pow(d, 2) + Math.pow(positions_[ii + 1].height - positions_[ii]
							 | 
						|||
| 
								 | 
							
								                            .height,
							 | 
						|||
| 
								 | 
							
								                            2)) + distance_;
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    distance = parseFloat(distance_.toFixed(2));
							 | 
						|||
| 
								 | 
							
								                    //在三维场景中添加Label
							 | 
						|||
| 
								 | 
							
								                    var textDisance = distance + "米";
							 | 
						|||
| 
								 | 
							
								                    if (distance > 1000) {
							 | 
						|||
| 
								 | 
							
								                        textDisance = (distance / 1000).toFixed(3) + "千米";
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                    floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                        name: '空间直线距离',
							 | 
						|||
| 
								 | 
							
								                        position: positions[positions.length - 1],
							 | 
						|||
| 
								 | 
							
								                        point: {
							 | 
						|||
| 
								 | 
							
								                            pixelSize: 5,
							 | 
						|||
| 
								 | 
							
								                            color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                            outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                            outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        },
							 | 
						|||
| 
								 | 
							
								                        label: {
							 | 
						|||
| 
								 | 
							
								                            text: textDisance,
							 | 
						|||
| 
								 | 
							
								                            font: '18px sans-serif',
							 | 
						|||
| 
								 | 
							
								                            fillColor: Cesium.Color.GOLD,
							 | 
						|||
| 
								 | 
							
								                            style: Cesium.LabelStyle.FILL_AND_OUTLINE,
							 | 
						|||
| 
								 | 
							
								                            outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                            verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
							 | 
						|||
| 
								 | 
							
								                            pixelOffset: new Cesium.Cartesian2(20, -20),
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    });
							 | 
						|||
| 
								 | 
							
								                    me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								    //内部测量面积函数
							 | 
						|||
| 
								 | 
							
								    _measureAreaSpace() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        // 鼠标事件
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene._imageryLayerCollection);
							 | 
						|||
| 
								 | 
							
								        var positions = [];
							 | 
						|||
| 
								 | 
							
								        var tempPoints = [];
							 | 
						|||
| 
								 | 
							
								        var polygon = null;
							 | 
						|||
| 
								 | 
							
								        // var tooltip = document.getElementById("toolTip");
							 | 
						|||
| 
								 | 
							
								        var cartesian = null;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint; //浮动点
							 | 
						|||
| 
								 | 
							
								        // tooltip.style.display = "block";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.left = movement.endPosition.x + 3 + "px";
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.top = movement.endPosition.y - 25 + "px";
							 | 
						|||
| 
								 | 
							
								            // tooltip.innerHTML ='<p>单击开始,右击结束</p>';
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                let ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (positions.length >= 2) {
							 | 
						|||
| 
								 | 
							
								                if (!Cesium.defined(polygon)) {
							 | 
						|||
| 
								 | 
							
								                    polygon = new PolygonPrimitive(positions);
							 | 
						|||
| 
								 | 
							
								                } else {
							 | 
						|||
| 
								 | 
							
								                    positions.pop();
							 | 
						|||
| 
								 | 
							
								                    // cartesian.y += (1 + Math.random());
							 | 
						|||
| 
								 | 
							
								                    positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								                // tooltip.innerHTML='<p>'+distance+'米</p>';
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.display = "none";
							 | 
						|||
| 
								 | 
							
								            cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                let ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // cartesian = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (positions.length == 0) {
							 | 
						|||
| 
								 | 
							
								                positions.push(cartesian.clone());
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //positions.pop();
							 | 
						|||
| 
								 | 
							
								            positions.push(cartesian);
							 | 
						|||
| 
								 | 
							
								            //在三维场景中添加点
							 | 
						|||
| 
								 | 
							
								            var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);
							 | 
						|||
| 
								 | 
							
								            var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								            var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								            var heightString = cartographic.height;
							 | 
						|||
| 
								 | 
							
								            tempPoints.push({
							 | 
						|||
| 
								 | 
							
								                lon: longitudeString,
							 | 
						|||
| 
								 | 
							
								                lat: latitudeString,
							 | 
						|||
| 
								 | 
							
								                hei: heightString
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '多边形面积',
							 | 
						|||
| 
								 | 
							
								                position: positions[positions.length - 1],
							 | 
						|||
| 
								 | 
							
								                point: {
							 | 
						|||
| 
								 | 
							
								                    pixelSize: 3,
							 | 
						|||
| 
								 | 
							
								                    color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                    outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                    outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								            positions.pop();
							 | 
						|||
| 
								 | 
							
								            //tempPoints.pop();
							 | 
						|||
| 
								 | 
							
								            // viewer.entities.remove(floatingPoint);
							 | 
						|||
| 
								 | 
							
								            // tooltip.style.display = "none";
							 | 
						|||
| 
								 | 
							
								            //在三维场景中添加点
							 | 
						|||
| 
								 | 
							
								            // var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);
							 | 
						|||
| 
								 | 
							
								            // var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								            // var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								            // var heightString = cartographic.height;
							 | 
						|||
| 
								 | 
							
								            // tempPoints.push({ lon: longitudeString, lat: latitudeString ,hei:heightString});
							 | 
						|||
| 
								 | 
							
								            var a = getArea(tempPoints);
							 | 
						|||
| 
								 | 
							
								            if (a < 0.001) {
							 | 
						|||
| 
								 | 
							
								                a = (a * 1000000).toFixed(4) + "平方米";
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                a = a.toFixed(4) + "平方公里";
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            var textArea = a;
							 | 
						|||
| 
								 | 
							
								            var et = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '多边形面积',
							 | 
						|||
| 
								 | 
							
								                position: positions[positions.length - 1],
							 | 
						|||
| 
								 | 
							
								                // point : {
							 | 
						|||
| 
								 | 
							
								                //  pixelSize : 5,
							 | 
						|||
| 
								 | 
							
								                //  color : Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                //  outlineColor : Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                //  outlineWidth : 2,
							 | 
						|||
| 
								 | 
							
								                //  heightReference:Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                // },
							 | 
						|||
| 
								 | 
							
								                label: {
							 | 
						|||
| 
								 | 
							
								                    text: textArea,
							 | 
						|||
| 
								 | 
							
								                    font: '18px sans-serif',
							 | 
						|||
| 
								 | 
							
								                    fillColor: Cesium.Color.CYAN,
							 | 
						|||
| 
								 | 
							
								                    style: Cesium.LabelStyle.FILL_AND_OUTLINE,
							 | 
						|||
| 
								 | 
							
								                    outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                    verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
							 | 
						|||
| 
								 | 
							
								                    pixelOffset: new Cesium.Cartesian2(20, -40),
							 | 
						|||
| 
								 | 
							
								                    disableDepthTestDistance: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(et.id);
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var radiansPerDegree = Math.PI / 180.0; //角度转化为弧度(rad)
							 | 
						|||
| 
								 | 
							
								        var degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //计算多边形面积
							 | 
						|||
| 
								 | 
							
								        function getArea(points) {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            var res = 0;
							 | 
						|||
| 
								 | 
							
								            //拆分三角曲面
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            for (var i = 0; i < points.length - 2; i++) {
							 | 
						|||
| 
								 | 
							
								                var j = (i + 1) % points.length;
							 | 
						|||
| 
								 | 
							
								                var k = (i + 2) % points.length;
							 | 
						|||
| 
								 | 
							
								                var totalAngle = Angle(points[i], points[j], points[k]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                var dis_temp1 = distance(positions[i], positions[j]);
							 | 
						|||
| 
								 | 
							
								                var dis_temp2 = distance(positions[j], positions[k]);
							 | 
						|||
| 
								 | 
							
								                res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle));
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return (res / 1000000.0);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        /*角度*/
							 | 
						|||
| 
								 | 
							
								        function Angle(p1, p2, p3) {
							 | 
						|||
| 
								 | 
							
								            var bearing21 = Bearing(p2, p1);
							 | 
						|||
| 
								 | 
							
								            var bearing23 = Bearing(p2, p3);
							 | 
						|||
| 
								 | 
							
								            var angle = bearing21 - bearing23;
							 | 
						|||
| 
								 | 
							
								            if (angle < 0) {
							 | 
						|||
| 
								 | 
							
								                angle += 360;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return angle;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /*方向*/
							 | 
						|||
| 
								 | 
							
								        function Bearing(from, to) {
							 | 
						|||
| 
								 | 
							
								            var lat1 = from.lat * radiansPerDegree;
							 | 
						|||
| 
								 | 
							
								            var lon1 = from.lon * radiansPerDegree;
							 | 
						|||
| 
								 | 
							
								            var lat2 = to.lat * radiansPerDegree;
							 | 
						|||
| 
								 | 
							
								            var lon2 = to.lon * radiansPerDegree;
							 | 
						|||
| 
								 | 
							
								            var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math
							 | 
						|||
| 
								 | 
							
								                .sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
							 | 
						|||
| 
								 | 
							
								            if (angle < 0) {
							 | 
						|||
| 
								 | 
							
								                angle += Math.PI * 2.0;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            angle = angle * degreesPerRadian; //角度
							 | 
						|||
| 
								 | 
							
								            return angle;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        var PolygonPrimitive = (function () {
							 | 
						|||
| 
								 | 
							
								            function _(positions) {
							 | 
						|||
| 
								 | 
							
								                this.options = {
							 | 
						|||
| 
								 | 
							
								                    name: '多边形',
							 | 
						|||
| 
								 | 
							
								                    polygon: {
							 | 
						|||
| 
								 | 
							
								                        hierarchy: [],
							 | 
						|||
| 
								 | 
							
								                        // perPositionHeight : true,
							 | 
						|||
| 
								 | 
							
								                        material: Cesium.Color.DARKTURQUOISE.withAlpha(0.4),
							 | 
						|||
| 
								 | 
							
								                        outlineColor: Cesium.Color.CYAN.withAlpha(0.8),
							 | 
						|||
| 
								 | 
							
								                        // heightReference:20000
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                this.hierarchy = {
							 | 
						|||
| 
								 | 
							
								                    positions
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                this._init();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            _.prototype._init = function () {
							 | 
						|||
| 
								 | 
							
								                var _self = this;
							 | 
						|||
| 
								 | 
							
								                var _update = function () {
							 | 
						|||
| 
								 | 
							
								                    return _self.hierarchy;
							 | 
						|||
| 
								 | 
							
								                };
							 | 
						|||
| 
								 | 
							
								                //实时更新polygon.hierarchy
							 | 
						|||
| 
								 | 
							
								                this.options.polygon.hierarchy = new Cesium.CallbackProperty(_update, false);
							 | 
						|||
| 
								 | 
							
								                var et = viewer.entities.add(this.options);
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(et.id);
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return _;
							 | 
						|||
| 
								 | 
							
								        })();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        function distance(point1, point2) {
							 | 
						|||
| 
								 | 
							
								            var point1cartographic = Cesium.Cartographic.fromCartesian(point1);
							 | 
						|||
| 
								 | 
							
								            var point2cartographic = Cesium.Cartographic.fromCartesian(point2);
							 | 
						|||
| 
								 | 
							
								            /**根据经纬度计算出距离**/
							 | 
						|||
| 
								 | 
							
								            var geodesic = new Cesium.EllipsoidGeodesic();
							 | 
						|||
| 
								 | 
							
								            geodesic.setEndPoints(point1cartographic, point2cartographic);
							 | 
						|||
| 
								 | 
							
								            var s = geodesic.surfaceDistance;
							 | 
						|||
| 
								 | 
							
								            //console.log(Math.sqrt(Math.pow(distance, 2) + Math.pow(endheight, 2)));
							 | 
						|||
| 
								 | 
							
								            //返回两点之间的距离
							 | 
						|||
| 
								 | 
							
								            s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
							 | 
						|||
| 
								 | 
							
								            return s;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //高度差
							 | 
						|||
| 
								 | 
							
								    _altitude() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        var trianArr = [];
							 | 
						|||
| 
								 | 
							
								        var distanceLineNum = 0;
							 | 
						|||
| 
								 | 
							
								        var Line1, Line2;
							 | 
						|||
| 
								 | 
							
								        var H;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint; //浮动点
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								                var lon = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								                var lat = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								                var MouseHeight = cartographic.height;
							 | 
						|||
| 
								 | 
							
								                trianArr.length = 3;
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								                draw_Triangle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								            var lon = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								            var lat = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								            var MouseHeight = cartographic.height;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '多边形面积',
							 | 
						|||
| 
								 | 
							
								                position: cartesian,
							 | 
						|||
| 
								 | 
							
								                point: {
							 | 
						|||
| 
								 | 
							
								                    pixelSize: 3,
							 | 
						|||
| 
								 | 
							
								                    color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                    outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                    outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            distanceLineNum++;
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                trianArr.length = 3;
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								                me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								                viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								                draw_Triangle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        function draw_Triangle() {
							 | 
						|||
| 
								 | 
							
								            if (Cesium.defined(Line1)) {
							 | 
						|||
| 
								 | 
							
								                //更新三角线
							 | 
						|||
| 
								 | 
							
								                Line1.polyline.positions = trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([
							 | 
						|||
| 
								 | 
							
								                    trianArr[0],
							 | 
						|||
| 
								 | 
							
								                    trianArr[1], trianArr[5], trianArr[0], trianArr[1], trianArr[2]
							 | 
						|||
| 
								 | 
							
								                ]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
							 | 
						|||
| 
								 | 
							
								                    3], trianArr[4], trianArr[5]]);
							 | 
						|||
| 
								 | 
							
								                Line2.polyline.positions = trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([
							 | 
						|||
| 
								 | 
							
								                    trianArr[0],
							 | 
						|||
| 
								 | 
							
								                    trianArr[1], trianArr[5], trianArr[3], trianArr[4],
							 | 
						|||
| 
								 | 
							
								                    trianArr[5]
							 | 
						|||
| 
								 | 
							
								                ]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
							 | 
						|||
| 
								 | 
							
								                    0], trianArr[1], trianArr[2]]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                //高度
							 | 
						|||
| 
								 | 
							
								                var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
							 | 
						|||
| 
								 | 
							
								                H.position = trianArr[5] > 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);
							 | 
						|||
| 
								 | 
							
								                H.label.text = '高度差:' + height + '米';
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            Line1 = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'triangleLine',
							 | 
						|||
| 
								 | 
							
								                polyline: {
							 | 
						|||
| 
								 | 
							
								                    positions: trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0],
							 | 
						|||
| 
								 | 
							
								                        trianArr[1], trianArr[5], trianArr[0], trianArr[1], trianArr[2]
							 | 
						|||
| 
								 | 
							
								                    ]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
							 | 
						|||
| 
								 | 
							
								                        3], trianArr[4], trianArr[5]]),
							 | 
						|||
| 
								 | 
							
								                    arcType: Cesium.ArcType.NONE,
							 | 
						|||
| 
								 | 
							
								                    width: 2,
							 | 
						|||
| 
								 | 
							
								                    material: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.CHARTREUSE
							 | 
						|||
| 
								 | 
							
								                    }),
							 | 
						|||
| 
								 | 
							
								                    depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED
							 | 
						|||
| 
								 | 
							
								                    })
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(Line1.id);
							 | 
						|||
| 
								 | 
							
								            Line2 = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'triangleLine',
							 | 
						|||
| 
								 | 
							
								                polyline: {
							 | 
						|||
| 
								 | 
							
								                    positions: trianArr[5] > trianArr[2] ? new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[0],
							 | 
						|||
| 
								 | 
							
								                        trianArr[1], trianArr[5], trianArr[3], trianArr[4],
							 | 
						|||
| 
								 | 
							
								                        trianArr[5]
							 | 
						|||
| 
								 | 
							
								                    ]) : new Cesium.Cartesian3.fromDegreesArrayHeights([trianArr[3], trianArr[4], trianArr[2], trianArr[
							 | 
						|||
| 
								 | 
							
								                        0], trianArr[1], trianArr[2]]),
							 | 
						|||
| 
								 | 
							
								                    arcType: Cesium.ArcType.NONE,
							 | 
						|||
| 
								 | 
							
								                    width: 2,
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                    // material: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                    material: new Cesium.PolylineDashMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.CHARTREUSE,
							 | 
						|||
| 
								 | 
							
								                        // dashLength: 5,
							 | 
						|||
| 
								 | 
							
								                        // dashPattern: 10,
							 | 
						|||
| 
								 | 
							
								                        // gapColor:Cesium.Color.YELLOW
							 | 
						|||
| 
								 | 
							
								                    }),
							 | 
						|||
| 
								 | 
							
								                    // depthFailMaterial: new Cesium.PolylineOutlineMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                    depthFailMaterial: new Cesium.PolylineDashMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED
							 | 
						|||
| 
								 | 
							
								                    })
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(Line2.id);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // 空间
							 | 
						|||
| 
								 | 
							
								            var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
							 | 
						|||
| 
								 | 
							
								                Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
							 | 
						|||
| 
								 | 
							
								            //高度
							 | 
						|||
| 
								 | 
							
								            var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
							 | 
						|||
| 
								 | 
							
								            H = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'lineZ',
							 | 
						|||
| 
								 | 
							
								                position: trianArr[5] > 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: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    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
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(H.id);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //三角测量
							 | 
						|||
| 
								 | 
							
								    _Triangle() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        var trianArr = [];
							 | 
						|||
| 
								 | 
							
								        var distanceLineNum = 0;
							 | 
						|||
| 
								 | 
							
								        var XLine;
							 | 
						|||
| 
								 | 
							
								        var X, Y, H;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint; //浮动点
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								                var lon = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								                var lat = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								                var MouseHeight = cartographic.height;
							 | 
						|||
| 
								 | 
							
								                trianArr.length = 3;
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								                draw_Triangle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
							 | 
						|||
| 
								 | 
							
								            var lon = Cesium.Math.toDegrees(cartographic.longitude);
							 | 
						|||
| 
								 | 
							
								            var lat = Cesium.Math.toDegrees(cartographic.latitude);
							 | 
						|||
| 
								 | 
							
								            var MouseHeight = cartographic.height;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '多边形面积',
							 | 
						|||
| 
								 | 
							
								                position: cartesian,
							 | 
						|||
| 
								 | 
							
								                point: {
							 | 
						|||
| 
								 | 
							
								                    pixelSize: 3,
							 | 
						|||
| 
								 | 
							
								                    color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                    outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                    outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            distanceLineNum++;
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                trianArr.length = 3;
							 | 
						|||
| 
								 | 
							
								                trianArr.push(lon, lat, MouseHeight);
							 | 
						|||
| 
								 | 
							
								                me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								                viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								                draw_Triangle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        function draw_Triangle() {
							 | 
						|||
| 
								 | 
							
								            if (Cesium.defined(XLine)) {
							 | 
						|||
| 
								 | 
							
								                //更新三角线
							 | 
						|||
| 
								 | 
							
								                XLine.polyline.positions = trianArr[5] > 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]
							 | 
						|||
| 
								 | 
							
								                ]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                // 空间
							 | 
						|||
| 
								 | 
							
								                var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
							 | 
						|||
| 
								 | 
							
								                    Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
							 | 
						|||
| 
								 | 
							
								                //高度
							 | 
						|||
| 
								 | 
							
								                var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
							 | 
						|||
| 
								 | 
							
								                //直线距离
							 | 
						|||
| 
								 | 
							
								                var strLine = (Math.sqrt(Math.pow(lineDistance, 2) + Math.pow(height, 2))).toFixed(2);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                X.position = Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
							 | 
						|||
| 
								 | 
							
								                    4]) / 2, Math.max(trianArr[2], trianArr[5]));
							 | 
						|||
| 
								 | 
							
								                H.position = trianArr[5] > 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);
							 | 
						|||
| 
								 | 
							
								                Y.position = Cesium.Cartesian3.fromDegrees((trianArr[0] + trianArr[3]) / 2, (trianArr[1] + trianArr[
							 | 
						|||
| 
								 | 
							
								                    4]) / 2, (trianArr[2] + trianArr[5]) / 2);
							 | 
						|||
| 
								 | 
							
								                X.label.text = '水平距离:' + lineDistance + '米';
							 | 
						|||
| 
								 | 
							
								                H.label.text = '高度差:' + height + '米';
							 | 
						|||
| 
								 | 
							
								                Y.label.text = '空间距离:' + strLine + '米';
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            XLine = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'triangleLine',
							 | 
						|||
| 
								 | 
							
								                polyline: {
							 | 
						|||
| 
								 | 
							
								                    positions: trianArr[5] > 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
							 | 
						|||
| 
								 | 
							
								                    })
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(XLine.id);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // 空间
							 | 
						|||
| 
								 | 
							
								            var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(trianArr[0], trianArr[1]),
							 | 
						|||
| 
								 | 
							
								                Cesium.Cartesian3.fromDegrees(trianArr[3], trianArr[4])).toFixed(2);
							 | 
						|||
| 
								 | 
							
								            //高度
							 | 
						|||
| 
								 | 
							
								            var height = Math.abs(trianArr[2] - trianArr[5]).toFixed(2);
							 | 
						|||
| 
								 | 
							
								            //直线距离
							 | 
						|||
| 
								 | 
							
								            var strLine = (Math.sqrt(Math.pow(lineDistance, 2) + Math.pow(height, 2))).toFixed(2);
							 | 
						|||
| 
								 | 
							
								            X = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '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: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    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
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(X.id);
							 | 
						|||
| 
								 | 
							
								            H = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'lineZ',
							 | 
						|||
| 
								 | 
							
								                position: trianArr[5] > 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: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    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
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(H.id);
							 | 
						|||
| 
								 | 
							
								            Y = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: '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: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    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
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(Y.id);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    //方位角
							 | 
						|||
| 
								 | 
							
								    _measureAngle() {
							 | 
						|||
| 
								 | 
							
								        var me = this;
							 | 
						|||
| 
								 | 
							
								        var viewer = this.viewer;
							 | 
						|||
| 
								 | 
							
								        var pArr = [];
							 | 
						|||
| 
								 | 
							
								        var distanceLineNum = 0;
							 | 
						|||
| 
								 | 
							
								        var Line1;
							 | 
						|||
| 
								 | 
							
								        var Line2;
							 | 
						|||
| 
								 | 
							
								        var angleT;
							 | 
						|||
| 
								 | 
							
								        var floatingPoint; //浮动点
							 | 
						|||
| 
								 | 
							
								        me.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.endPosition);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //cartesian = viewer.scene.camera.pickEllipsoid(movement.endPosition, viewer.scene.globe.ellipsoid);
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                pArr.length = 1;
							 | 
						|||
| 
								 | 
							
								                pArr.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                draw_Angle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								            if (!Cesium.defined(cartesian)) {
							 | 
						|||
| 
								 | 
							
								                var ray = viewer.camera.getPickRay(movement.position);
							 | 
						|||
| 
								 | 
							
								                cartesian = viewer.scene.globe.pick(ray, viewer.scene);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // var cartesian = viewer.scene.pickPosition(movement.position);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            distanceLineNum++;
							 | 
						|||
| 
								 | 
							
								            if (distanceLineNum === 1) {
							 | 
						|||
| 
								 | 
							
								                pArr.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                floatingPoint = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                    name: '方位角',
							 | 
						|||
| 
								 | 
							
								                    position: cartesian,
							 | 
						|||
| 
								 | 
							
								                    point: {
							 | 
						|||
| 
								 | 
							
								                        pixelSize: 3,
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED,
							 | 
						|||
| 
								 | 
							
								                        outlineColor: Cesium.Color.WHITE,
							 | 
						|||
| 
								 | 
							
								                        outlineWidth: 2,
							 | 
						|||
| 
								 | 
							
								                        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                });
							 | 
						|||
| 
								 | 
							
								                me.measureIds.push(floatingPoint.id);
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                pArr.length = 1;
							 | 
						|||
| 
								 | 
							
								                pArr.push(cartesian);
							 | 
						|||
| 
								 | 
							
								                me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								                me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								                viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								                draw_Angle();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        me.handler.setInputAction(function (movement) {
							 | 
						|||
| 
								 | 
							
								            me.handler.destroy();
							 | 
						|||
| 
								 | 
							
								            me.bMeasuring = false;
							 | 
						|||
| 
								 | 
							
								            viewer._container.style.cursor = "";
							 | 
						|||
| 
								 | 
							
								        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        function draw_Angle() {
							 | 
						|||
| 
								 | 
							
								            // 空间
							 | 
						|||
| 
								 | 
							
								            var cartographic1 = Cesium.Cartographic.fromCartesian(pArr[0]);
							 | 
						|||
| 
								 | 
							
								            var lon1 = Cesium.Math.toDegrees(cartographic1.longitude);
							 | 
						|||
| 
								 | 
							
								            var lat1 = Cesium.Math.toDegrees(cartographic1.latitude);
							 | 
						|||
| 
								 | 
							
								            var cartographic2 = Cesium.Cartographic.fromCartesian(pArr[1]);
							 | 
						|||
| 
								 | 
							
								            var lon2 = Cesium.Math.toDegrees(cartographic2.longitude);
							 | 
						|||
| 
								 | 
							
								            var lat2 = Cesium.Math.toDegrees(cartographic2.latitude);
							 | 
						|||
| 
								 | 
							
								            var lineDistance = Cesium.Cartesian3.distance(Cesium.Cartesian3.fromDegrees(lon1, lat1),
							 | 
						|||
| 
								 | 
							
								                Cesium.Cartesian3.fromDegrees(lon2, lat2));
							 | 
						|||
| 
								 | 
							
								            var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(lon1, lat1));
							 | 
						|||
| 
								 | 
							
								            var NorthPoint = Cesium.Cartographic.fromCartesian(Cesium.Matrix4.multiplyByPoint(localToWorld_Matrix, Cesium
							 | 
						|||
| 
								 | 
							
								                .Cartesian3.fromElements(0,
							 | 
						|||
| 
								 | 
							
								                    lineDistance,
							 | 
						|||
| 
								 | 
							
								                    0), new Cesium.Cartesian3()));
							 | 
						|||
| 
								 | 
							
								            var npLon = Cesium.Math.toDegrees(NorthPoint.longitude);
							 | 
						|||
| 
								 | 
							
								            var npLat = Cesium.Math.toDegrees(NorthPoint.latitude);
							 | 
						|||
| 
								 | 
							
								            // var angle = Cesium.Cartesian3.angleBetween(Cesium.Cartesian3.fromDegrees(lon1, lat1),
							 | 
						|||
| 
								 | 
							
								            //     Cesium.Cartesian3.fromDegrees(lon2, lat2));
							 | 
						|||
| 
								 | 
							
								            var angle = courseAngle(lon1, lat1, lon2, lat2);
							 | 
						|||
| 
								 | 
							
								            var textDisance = lineDistance.toFixed(2) + "米";
							 | 
						|||
| 
								 | 
							
								            if (lineDistance > 1000) {
							 | 
						|||
| 
								 | 
							
								                textDisance = (lineDistance / 1000).toFixed(3) + "千米";
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            if (Cesium.defined(Line1)) {
							 | 
						|||
| 
								 | 
							
								                //更新线
							 | 
						|||
| 
								 | 
							
								                Line1.polyline.positions = new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, npLon, npLat]);
							 | 
						|||
| 
								 | 
							
								                Line2.polyline.positions = new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, lon2, lat2]);
							 | 
						|||
| 
								 | 
							
								                angleT.label.text = '角度:' + angle + '°\n距离:' + textDisance;
							 | 
						|||
| 
								 | 
							
								                angleT.position = pArr[1];
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            //北方线
							 | 
						|||
| 
								 | 
							
								            Line1 = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'Angle1',
							 | 
						|||
| 
								 | 
							
								                polyline: {
							 | 
						|||
| 
								 | 
							
								                    positions: new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, npLon, npLat]),
							 | 
						|||
| 
								 | 
							
								                    width: 3,
							 | 
						|||
| 
								 | 
							
								                    material: new Cesium.PolylineDashMaterialProperty({
							 | 
						|||
| 
								 | 
							
								                        color: Cesium.Color.RED
							 | 
						|||
| 
								 | 
							
								                    }),
							 | 
						|||
| 
								 | 
							
								                    clampToGround: true
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(Line1.id);
							 | 
						|||
| 
								 | 
							
								            //线
							 | 
						|||
| 
								 | 
							
								            Line2 = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'Angle2',
							 | 
						|||
| 
								 | 
							
								                polyline: {
							 | 
						|||
| 
								 | 
							
								                    positions: new Cesium.Cartesian3.fromDegreesArray([lon1, lat1, lon2, lat2]),
							 | 
						|||
| 
								 | 
							
								                    width: 10,
							 | 
						|||
| 
								 | 
							
								                    material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.YELLOW),
							 | 
						|||
| 
								 | 
							
								                    clampToGround: true
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(Line2.id);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //文字
							 | 
						|||
| 
								 | 
							
								            angleT = viewer.entities.add({
							 | 
						|||
| 
								 | 
							
								                name: 'AngleT',
							 | 
						|||
| 
								 | 
							
								                position: pArr[1],
							 | 
						|||
| 
								 | 
							
								                label: {
							 | 
						|||
| 
								 | 
							
								                    text: '角度:' + angle + '°\n距离:' + textDisance,
							 | 
						|||
| 
								 | 
							
								                    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: 4,
							 | 
						|||
| 
								 | 
							
								                    scale: 0.5,
							 | 
						|||
| 
								 | 
							
								                    pixelOffset: new Cesium.Cartesian2(0, -40),
							 | 
						|||
| 
								 | 
							
								                    disableDepthTestDistance: Number.POSITIVE_INFINITY,
							 | 
						|||
| 
								 | 
							
								                    backgroundColor: new Cesium.Color.fromCssColorString("rgba(0, 0, 0, 1)"),
							 | 
						|||
| 
								 | 
							
								                    backgroundPadding: new Cesium.Cartesian2(10, 10),
							 | 
						|||
| 
								 | 
							
								                    verticalOrigin: Cesium.VerticalOrigin.BASELINE
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            });
							 | 
						|||
| 
								 | 
							
								            me.measureIds.push(angleT.id);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        function courseAngle(lng_a, lat_a, lng_b, lat_b) {
							 | 
						|||
| 
								 | 
							
								            /////////////方法
							 | 
						|||
| 
								 | 
							
								            var dRotateAngle = Math.atan2(Math.abs(lng_a - lng_b), Math.abs(lat_a - lat_b));
							 | 
						|||
| 
								 | 
							
								            if (lng_b >= lng_a) {
							 | 
						|||
| 
								 | 
							
								                if (lat_b >= lat_a) {} else {
							 | 
						|||
| 
								 | 
							
								                    dRotateAngle = Math.PI - dRotateAngle;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                if (lat_b >= lat_a) {
							 | 
						|||
| 
								 | 
							
								                    dRotateAngle = 2 * Math.PI - dRotateAngle;
							 | 
						|||
| 
								 | 
							
								                } else {
							 | 
						|||
| 
								 | 
							
								                    dRotateAngle = Math.PI + dRotateAngle;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            dRotateAngle = dRotateAngle * 180 / Math.PI;
							 | 
						|||
| 
								 | 
							
								            return parseInt(dRotateAngle * 100) / 100;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            /////方法
							 | 
						|||
| 
								 | 
							
								            // //以a点为原点建立局部坐标系(东方向为x轴,北方向为y轴,垂直于地面为z轴),得到一个局部坐标到世界坐标转换的变换矩阵
							 | 
						|||
| 
								 | 
							
								            // var localToWorld_Matrix = Cesium.Transforms.eastNorthUpToFixedFrame(new Cesium.Cartesian3.fromDegrees(lng_a, lat_a));
							 | 
						|||
| 
								 | 
							
								            // //求世界坐标到局部坐标的变换矩阵
							 | 
						|||
| 
								 | 
							
								            // var worldToLocal_Matrix = Cesium.Matrix4.inverse(localToWorld_Matrix, new Cesium.Matrix4());
							 | 
						|||
| 
								 | 
							
								            // //a点在局部坐标的位置,其实就是局部坐标原点
							 | 
						|||
| 
								 | 
							
								            // var localPosition_A = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, new Cesium.Cartesian3.fromDegrees(lng_a, lat_a), new Cesium.Cartesian3());
							 | 
						|||
| 
								 | 
							
								            // //B点在以A点为原点的局部的坐标位置
							 | 
						|||
| 
								 | 
							
								            // var localPosition_B = Cesium.Matrix4.multiplyByPoint(worldToLocal_Matrix, new Cesium.Cartesian3.fromDegrees(lng_b, lat_b), new Cesium.Cartesian3());
							 | 
						|||
| 
								 | 
							
								            // //弧度
							 | 
						|||
| 
								 | 
							
								            // var angle = Math.atan2((localPosition_B.y - localPosition_A.y), (localPosition_B.x - localPosition_A.x))
							 | 
						|||
| 
								 | 
							
								            // //角度
							 | 
						|||
| 
								 | 
							
								            // var theta = angle * (180 / Math.PI);
							 | 
						|||
| 
								 | 
							
								            // if (theta < 0) {
							 | 
						|||
| 
								 | 
							
								            //     theta = theta + 360;
							 | 
						|||
| 
								 | 
							
								            // }
							 | 
						|||
| 
								 | 
							
								            // return theta.toFixed(2);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |