//from cdxiaodao cesium.js //measure or survey point, height, distance, area (function (window) { 'use strict'; function define_CesiumSurvey() { //Main object var CesiumSurvey = {}; var handler; //Get 3D position String when left_click CesiumSurvey.getPosition = function(viewer){ handler = handler && handler.destroy(); handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); var resultStr; handler.setInputAction(function(movement){ var cp = viewer.scene.pickPosition(movement.position); var pickedPositionString = cp.toString(); //获取地理坐标(经度、纬度、高程) var cartographic = Cesium.Cartographic.fromCartesian(cp); var longitudeString = Cesium.Math.toDegrees(cartographic.longitude); var latitudeString = Cesium.Math.toDegrees(cartographic.latitude); var heightString = cartographic.height; var getResult = pickedPositionString+'\r\n'+ '======================'+'\r\n'+ '经度:'+longitudeString+'\r\n'+ '纬度:'+latitudeString+'\r\n'+ '高程:'+heightString+'\r\n'+ '======================'+'\r\n'; resultStr = longitudeString+","+latitudeString+","+heightString; alert(getResult); },Cesium.ScreenSpaceEventType.LEFT_CLICK); handler.setInputAction(function(){ handler = handler && handler.destroy(); },Cesium.ScreenSpaceEventType.RIGHT_CLICK); return resultStr; }; //Get height String from 3dtiles to Mouse's position CesiumSurvey.measureHeight = function (viewer){ handler = handler && handler.destroy(); if((viewer.entities.getById('measureHeightLineEntity')!==undefined)){ viewer.entities.removeById('measureHeightLineEntity'); } if((viewer.entities.getById('heightPlaneEntity')!==undefined)){ viewer.entities.removeById('heightPlaneEntity'); } if((viewer.entities.getById('heightLabelEntity')!==undefined)){ viewer.entities.removeById('heightLabelEntity'); } var isFirst = true; var firstPosition; var secondPosition; var previousPosition; var heightLineEntity = viewer.entities.add({ id : 'measureHeightLineEntity', polyline : { followSurface : false, width : 3, material : Cesium.Color.RED, show : true } }); var heightPlaneEntity = viewer.entities.add({ id : 'heightPlaneEntity', ellipse : { outline : true, show : false } }); var heightLabelEntity = viewer.entities.add({ id : 'heightLabelEntity', label : { show : false, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, horizontalOrigin : Cesium.HorizontalOrigin.LEFT, font : '16px Helvetica', fillColor : Cesium.Color.YELLOW, outlineColor : Cesium.Color.BLACK, outlineWidth : 1, style : Cesium.LabelStyle.FILL_AND_OUTLINE, showBackground: true, backgroundColor: new Cesium.Color(0, 0, 1, 0.8), } }); handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function(movement){ if(isFirst){ firstPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(firstPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); firstPosition = viewer.scene.globe.pick(ray,viewer.scene); } isFirst = false; }else{ secondPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(secondPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); secondPosition = viewer.scene.globe.pick(ray,viewer.scene); } if(secondPosition){ previousPosition = secondPosition.clone(); }else{ secondPosition = previousPosition.clone(); } var centerPosition = new Cesium.Cartesian3( firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition) ); heightLineEntity.polyline.positions = [firstPosition,centerPosition]; heightPlaneEntity.position = centerPosition; var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition); var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition); heightPlaneEntity.ellipse.height = cartographicCenter.height; heightPlaneEntity.ellipse.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.YELLOW.withAlpha(0.5):Cesium.Color.DEEPPINK.withAlpha(0.2); heightPlaneEntity.ellipse.semiMinorAxis = Cesium.Cartesian3.distance(centerPosition,secondPosition); heightPlaneEntity.ellipse.semiMajorAxis = heightPlaneEntity.ellipse.semiMinorAxis; heightPlaneEntity.ellipse.show = true; heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition; heightLabelEntity.label.show = true; resultStr = cartographicCenter.height-cartographicFirst.height; heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米'; var camera = viewer.scene.camera; heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0); handler = handler && handler.destroy(); } },Cesium.ScreenSpaceEventType.LEFT_CLICK); var resultStr; handler.setInputAction(function(movement){ if(!isFirst){ secondPosition = viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(secondPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.endPosition); secondPosition = viewer.scene.globe.pick(ray,viewer.scene); } if(secondPosition){ previousPosition = secondPosition.clone(); }else{ secondPosition = previousPosition.clone(); } var centerPosition = new Cesium.Cartesian3( firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition) ); heightLineEntity.polyline.positions = [firstPosition,centerPosition]; heightPlaneEntity.position = centerPosition; var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition); var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition); heightPlaneEntity.ellipse.height = cartographicCenter.height; heightPlaneEntity.ellipse.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.YELLOW.withAlpha(0.5):Cesium.Color.DEEPPINK.withAlpha(0.2); heightPlaneEntity.ellipse.semiMinorAxis = Cesium.Cartesian3.distance(centerPosition,secondPosition); heightPlaneEntity.ellipse.semiMajorAxis = heightPlaneEntity.ellipse.semiMinorAxis; heightPlaneEntity.ellipse.show = true; heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition; heightLabelEntity.label.show = true; resultStr = cartographicCenter.height-cartographicFirst.height; heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米'; var camera = viewer.scene.camera; heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0); } },Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function(){ handler = handler && handler.destroy(); },Cesium.ScreenSpaceEventType.RIGHT_CLICK); return resultStr; }; //Get height String from 3dtiles to Mouse's position(三角尺) CesiumSurvey.measureHeightAngle = function (viewer){ handler = handler && handler.destroy(); if((viewer.entities.getById('measureHeightAngleLineEntity')!==undefined)){ viewer.entities.removeById('measureHeightAngleLineEntity'); } if((viewer.entities.getById('heightAngleEntity')!==undefined)){ viewer.entities.removeById('heightAngleEntity'); } if((viewer.entities.getById('heighthriEntity')!==undefined)){ viewer.entities.removeById('heighthriEntity'); } if((viewer.entities.getById('heightLabelAngleEntity')!==undefined)){ viewer.entities.removeById('heightLabelAngleEntity'); } var isFirst = true; var firstPosition; var secondPosition; var previousPosition; var heightLineEntity = viewer.entities.add({ id : 'measureHeightAngleLineEntity', polyline : { followSurface : false, width : 3, material : Cesium.Color.RED, show : true } }); var heightAngleEntity = viewer.entities.add({ id : 'heightAngleEntity', polyline : { width : 3, material : Cesium.Color.RED, show : true } }); var heighthriEntity = viewer.entities.add({ id : 'heighthriEntity', polyline : { width : 3, material : Cesium.Color.RED, show : true } }); var heightLabelEntity = viewer.entities.add({ id : 'heightLabelAngleEntity', label : { show : false, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, horizontalOrigin : Cesium.HorizontalOrigin.LEFT, font : '16px Helvetica', fillColor : Cesium.Color.YELLOW, outlineColor : Cesium.Color.BLACK, outlineWidth : 1, style : Cesium.LabelStyle.FILL_AND_OUTLINE, showBackground: true, backgroundColor: new Cesium.Color(0, 0, 1, 0.8), } }); handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function(movement){ if(isFirst){ firstPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(firstPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); firstPosition = viewer.scene.globe.pick(ray,viewer.scene); } isFirst = false; }else{ secondPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(secondPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); secondPosition = viewer.scene.globe.pick(ray,viewer.scene); } if(secondPosition){ previousPosition = secondPosition.clone(); }else{ secondPosition = previousPosition.clone(); } var centerPosition = new Cesium.Cartesian3( firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition) ); heightLineEntity.polyline.positions = [firstPosition,centerPosition]; heightAngleEntity.polyline.positions = [firstPosition,secondPosition]; heighthriEntity.polyline.positions = [centerPosition,secondPosition]; var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition); var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition); heightAngleEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW; heighthriEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW; heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition; heightLabelEntity.label.show = true; resultStr = cartographicCenter.height-cartographicFirst.height; var resulthoriStr = Cesium.Cartesian3.distance(centerPosition, secondPosition); var resultangleStr = Cesium.Cartesian3.distance(firstPosition, secondPosition); heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米\n'+"水平:"+resulthoriStr.toFixed(2)+'米\n'+"直线:"+resultangleStr.toFixed(2)+"米"; var camera = viewer.scene.camera; heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0); handler = handler && handler.destroy(); } },Cesium.ScreenSpaceEventType.LEFT_CLICK); var resultStr; handler.setInputAction(function(movement){ if(!isFirst){ secondPosition = viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(secondPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.endPosition); secondPosition = viewer.scene.globe.pick(ray,viewer.scene); } if(secondPosition){ previousPosition = secondPosition.clone(); }else{ secondPosition = previousPosition.clone(); } var centerPosition = new Cesium.Cartesian3( firstPosition.x * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.y * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition), firstPosition.z * Cesium.Cartesian3.dot(firstPosition, secondPosition)/Cesium.Cartesian3.magnitudeSquared(firstPosition) ); heightLineEntity.polyline.positions = [firstPosition,centerPosition]; heightAngleEntity.polyline.positions = [firstPosition,secondPosition]; heighthriEntity.polyline.positions = [centerPosition,secondPosition]; var cartographicCenter = Cesium.Cartographic.fromCartesian(centerPosition); var cartographicFirst = Cesium.Cartographic.fromCartesian(firstPosition); heightAngleEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW; heighthriEntity.polyline.material = (cartographicCenter.height>cartographicFirst.height)>0?Cesium.Color.RED:Cesium.Color.YELLOW; heightLabelEntity.position = (cartographicCenter.height>cartographicFirst.height)>0?centerPosition:firstPosition; heightLabelEntity.label.show = true; resultStr = cartographicCenter.height-cartographicFirst.height; var resulthoriStr = Cesium.Cartesian3.distance(centerPosition, secondPosition); var resultangleStr = Cesium.Cartesian3.distance(firstPosition, secondPosition); heightLabelEntity.label.text = '高度:'+resultStr.toFixed(2)+'米\n'+"水平:"+resulthoriStr.toFixed(2)+'米\n'+"直线:"+resultangleStr.toFixed(2)+"米"; var camera = viewer.scene.camera; heightLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.5, 0.0); } },Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function(){ handler = handler && handler.destroy(); },Cesium.ScreenSpaceEventType.RIGHT_CLICK); return resultStr; }; //Get distence String between first left_click and second left_click CesiumSurvey.measureDist = function(viewer,type){ handler = handler && handler.destroy(); if((viewer.entities.getById('dynamicLineEntity')!==undefined)){ viewer.entities.removeById('dynamicLineEntity'); } if((viewer.entities.getById('dynamicLineGroundEntity')!==undefined)){ viewer.entities.removeById('dynamicLineGroundEntity'); } if((viewer.entities.getById('measureLineEntity')!==undefined)){ viewer.entities.removeById('measureLineEntity'); } if((viewer.entities.getById('measureLineGroundEntity')!==undefined)){ viewer.entities.removeById('measureLineGroundEntity'); } if((viewer.entities.getById('distLabelEntity')!==undefined)){ viewer.entities.removeById('distLabelEntity'); } var isFirst = true;//是否为第一个点 var previousPosition;//前一个点的坐标 var currentPosition;//当前点坐标 var measureValue = 0.0; //随鼠标移动的标签entity var distLabelEntity = viewer.entities.add({ id : 'distLabelEntity', label : { show : false, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, horizontalOrigin : Cesium.HorizontalOrigin.LEFT, font : '16px Helvetica', fillColor : Cesium.Color.YELLOW, outlineColor : Cesium.Color.BLACK, outlineWidth : 1, style : Cesium.LabelStyle.FILL_AND_OUTLINE, showBackground: true, backgroundColor: new Cesium.Color(0, 0, 1, 0.8), } }); var show3d = true,show2d = false; if(type=="two"){ show2d = true; show3d = false; } //前一个点与鼠标连线的entity var dynamicLineEntity = viewer.entities.add({ id : 'dynamicLineEntity', polyline : { followSurface : false, width : 3, material : Cesium.Color.YELLOW, show : show3d } }); var dynamicLineGroundEntity = viewer.entities.add({ id : 'dynamicLineGroundEntity', polyline : { clampToGround : true, width : 3, material : Cesium.Color.YELLOW, show : show2d, } }); //已输入的线段的entity var measureLineEntity = viewer.entities.add({ id : 'measureLineEntity', polyline : { followSurface : false, width : 3, material : Cesium.Color.RED, show : show3d } }); var measureLineGroundEntity = viewer.entities.add({ id : 'measureLineGroundEntity', polyline : { clampToGround : true, width : 3, material : Cesium.Color.RED, show : show2d } }); var measureLinePositonsArray = [];//存储已量测的线段的折点 handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function(movement){ if(isFirst){ previousPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(previousPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); previousPosition = viewer.scene.globe.pick(ray,viewer.scene); } var tmp1 = previousPosition.clone(); measureValue = 0.0; isFirst = false; measureLinePositonsArray.push(tmp1); }else{ currentPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); currentPosition = viewer.scene.globe.pick(ray,viewer.scene); } var tmp2 = currentPosition.clone(); measureLinePositonsArray.push(tmp2); measureLineEntity.polyline.positions = measureLinePositonsArray; measureLineGroundEntity.polyline.positions = measureLinePositonsArray; measureValue = measureValue + Cesium.Cartesian3.distance(currentPosition, previousPosition); previousPosition = currentPosition.clone(); } },Cesium.ScreenSpaceEventType.LEFT_CLICK); var measureValueShow; handler.setInputAction(function(movement){ //move事件监听 if(!isFirst){ //console.log('move,不是第一个点'); //获取当前点的坐标 currentPosition = viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(currentPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.endPosition); currentPosition = viewer.scene.globe.pick(ray,viewer.scene); } if(currentPosition){ distLabelEntity.position = currentPosition; distLabelEntity.label.show = true; measureValueShow = measureValue+Cesium.Cartesian3.distance(currentPosition, previousPosition); distLabelEntity.label.text = '距离:'+ measureValueShow.toFixed(2)+'米'; var camera = viewer.scene.camera; distLabelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 1, 0.0); dynamicLineEntity.polyline.positions = [previousPosition,currentPosition]; dynamicLineGroundEntity.polyline.positions = [previousPosition,currentPosition]; } } },Cesium.ScreenSpaceEventType.MOUSE_MOVE); handler.setInputAction(function(){ //move事件监听 handler = handler && handler.destroy(); },Cesium.ScreenSpaceEventType.RIGHT_CLICK); return measureValueShow; }; //Get area string by dynamic polygon on earth var pointArr = []; CesiumSurvey.measureArea = function(viewer){ var measureAreaValue = 0.0; var activeShapePoints = []; handler = handler && handler.destroy(); if((viewer.entities.getById('areaLabelEntity')!==undefined)){ viewer.entities.removeById('areaLabelEntity'); } if((viewer.entities.getById('areaEntity')!==undefined)){ viewer.entities.removeById('areaEntity'); } for (var i = 0; i < pointArr.length; i++) { viewer.entities.remove(pointArr[i]); } var areaLabelEntity = viewer.entities.add({ id : 'areaLabelEntity', label : { show : false, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, horizontalOrigin : Cesium.HorizontalOrigin.LEFT, font : '16px Helvetica', fillColor : Cesium.Color.YELLOW, outlineColor : Cesium.Color.BLACK, outlineWidth : 1, style : Cesium.LabelStyle.FILL_AND_OUTLINE, showBackground: true, backgroundColor: new Cesium.Color(0, 0, 1, 0.8), } }); function createPoint(worldPosition) { pointArr.push(viewer.entities.add({ position : worldPosition, point : { color : Cesium.Color.RED, pixelSize : 10, outlineWidth : 1, outlineColor : Cesium.Color.WHITE, disableDepthTestDistance : 10000 } })); } function drawPolygon(){ if((viewer.entities.getById('areaEntity')!==undefined)){ viewer.entities.removeById('areaEntity'); } viewer.entities.add({ id: 'areaEntity', polygon: { hierarchy: new Cesium.PolygonHierarchy(activeShapePoints), /*new Cesium.CallbackProperty(function () { return activeShapePoints; }, false),*/ material: new Cesium.ColorMaterialProperty(Cesium.Color.YELLOW.withAlpha(0.6)), classificationType : Cesium.ClassificationType.BOTH, outline: true, outlineColor: Cesium.Color.WHITE } }); } 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; } var radiansPerDegree = Cesium.Math.PI / 180.0;//角度转化为弧度(rad) var degreesPerRadian = 180.0 / Cesium.Math.PI;//弧度转化为角度 //计算多边形面积 function getArea(points) { var res = 0.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[0], points[j], points[k]); var dis_temp1 = distance(activeShapePoints[0], activeShapePoints[j]); var dis_temp2 = distance(activeShapePoints[0], activeShapePoints[k]); var tmp = 0.5*dis_temp1 * dis_temp2 * Math.sin(totalAngle*radiansPerDegree) ; res = res+tmp; //console.log(res); } return Math.abs(res.toFixed(1));//顺时针负,逆时针正 } /*角度*/ function Angle(p1, p2, p3) { var bearing12 = Bearing(p1, p2); var bearing13 = Bearing(p1, p3); var angle = bearing12 - bearing13; 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 += Cesium.Math.PI * 2.0; } angle = angle * degreesPerRadian;//角度 return angle; } //选点 handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function(movement){ var earthPosition = viewer.scene.pickPosition(movement.position); //获取地理坐标(经度、纬度、高程) var cartographic = Cesium.Cartographic.fromCartesian(earthPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); earthPosition = viewer.scene.globe.pick(ray,viewer.scene); } if (Cesium.defined(earthPosition)) { activeShapePoints.push(earthPosition); if(activeShapePoints.length>3){ drawPolygon(); } createPoint(earthPosition); } },Cesium.ScreenSpaceEventType.LEFT_CLICK); //移动 handler.setInputAction(function(movement) { var newPosition = viewer.scene.pickPosition(movement.endPosition); var cartographic = Cesium.Cartographic.fromCartesian(newPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.endPosition); newPosition = viewer.scene.globe.pick(ray,viewer.scene); } activeShapePoints.pop(); activeShapePoints.push(newPosition); }, Cesium.ScreenSpaceEventType.MOUSE_MOVE); //结束并计算 var areaResult; handler.setInputAction(function(movement){ handler = handler && handler.destroy(); if(activeShapePoints.length >2){ var rightPosition = viewer.scene.pickPosition(movement.position); var cartographic = Cesium.Cartographic.fromCartesian(rightPosition); var height = cartographic.height;//模型高度 if(Number(height)<0){ var ray = viewer.camera.getPickRay(movement.position); rightPosition = viewer.scene.globe.pick(ray,viewer.scene); } var tempPoints=[]; for(var pindex = 0;pindex