/* * @Descripttion: * @version: 1.0 * @Author: zhangti * @Date: 2019-10-10 16:45:02 * @LastEditors : sueRimn * @LastEditTime : 2020-01-14 17:03:18 */ /** * * 分析工具类 */ import mouseManager from './mouseManager.js'; import Primitives from './primitives.js'; import Entitys from './entitys.js'; import Tools from './cvTool.js'; import entityFactory from './entityFactory.js'; import config from './config.js'; export default class Analyser{ constructor(core){ //初始化分析工具 this._viewer = core; /** * mouseManager * 坐标转换 */ this.mouseManager = new mouseManager(core); /** * 绘图实体 */ this.Primitives = new Primitives(core); /** * 几何数据实体 */ this.entitys = new Entitys(core); /** * 初始化工具 */ this.Tools = new Tools(); /** * 常用配置 */ this._config = config; /** * 封装的实体 */ this.entityFactory = entityFactory; this.BEYONANALYSER_TYPE = { //分析功能 VISIBILITY:0, SLOPE:1, VISUALFIELD:2, POINTANALYSIS:3, SUBMERGED:4 } this.BEYONANALYSER_STATE = { PREPARE:0, OPERATING:1, END:2 }; //初始化 this.init(); } init(){ /** * 提示框 */ this.tipLabelEntity = this.entitys.add({ label : { name: 'analyse', show : false, showBackground : true, font : '14px monospace', horizontalOrigin : Cesium.HorizontalOrigin.LEFT, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, pixelOffset : new Cesium.Cartesian2(15, -10) } }); //进度条 function ProcessTool() { var win = document.getElementById("process-window"); if (!win) { var html = '
30%
'; document.body.insertAdjacentHTML("beforeend", html); win = document.getElementById("process-window"); } this.win = win; this.percent = document.getElementById("percent"); this.text = document.getElementById("text"); this.update = function (percent, text) { this.percent.innerText = percent; if (text) { this.text.innerText = text; } this.setVisible(true); }; this.setVisible = function (bVisible) { this.win.style.display = bVisible ? "" : "none"; }; this.setVisible(false); } //processTool this.processTool = new ProcessTool(); this.analysisEffects=[]; //this.posArray=[]; this.type = undefined; //handler this.handler = new Cesium.ScreenSpaceEventHandler(this._viewer.scene.canvas); } /** * 提示框 * @param {*} bShow * @param {*} position * @param {*} message */ showTip(label,bShow,position,message,effectOptions){ label.show = bShow; if(bShow){ if(position) label.position = position; if(message) label.label.text =message; if(effectOptions){ for(let key in effectOptions){ if(label.key){ label.key=effectOptions[key]; } } } } } /** * 添加分析 * @param {*} type * @param {*} options */ addAnalysis(type,options){ } /** * 销毁鼠标事件 */ destroyHandler(){ this.handler=this.handler&&this.handler.destroy(); } /** * 获取相交对象 * @param {*} startPos * @param {*} endPos * @param {*} excludeArr * @param {*} bDrillPick */ getIntersectObj(startPos,endPos,excludeArr=[],bDrillPick=false){ var viewer=this._viewer; var direction = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(endPos, startPos, new Cesium.Cartesian3()), new Cesium.Cartesian3()); var ray = new Cesium.Ray(startPos, direction); //无限延长的射线 var results = []; if (bDrillPick) { results = viewer.scene.drillPickFromRay(ray, 10, excludeArr); } else //只pick首个物体 { var result = viewer.scene.pickFromRay(ray, excludeArr); if (Cesium.defined(result)) { results = [result]; } } return results; } /** * 停止鼠标左键事件 */ stopViewerLeftClickHander(){ this.viewerHandler=this.viewerHandler||this._viewer._cesiumWidget.screenSpaceEventHandler; //保存一下视图的单击、双击事件 if(!Cesium.defined(this.viewActtion)){ this.viewActtion={}; this.viewActtion.leftClick=this.viewerHandler.getInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); this.viewActtion.leftDBClick=this.viewerHandler.getInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); } this.viewerHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK); this.viewerHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); } /** * 恢复鼠标左键事件 */ restoreViewerLeftClicHander(){ if(Cesium.defined(this.viewerHandler)&&Cesium.defined(this.viewActtion)){ this.viewerHandler.setInputAction(this.viewActtion.leftClick,Cesium.ScreenSpaceEventType.LEFT_CLICK); this.viewerHandler.setInputAction(this.viewActtion.leftDBClick,Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK); } } /** * 获取存在的效果 * @param {*} id */ getAnalysisEffect(id){ for (let index = 0; index < this.analysisEffects.length; index++) { var effect = this.analysisEffects[index]; if(id===effect.id){ return effect; } } return undefined; } //地球取点 pickMap(callback){ this.stopViewerLeftClickHander() this.destroyHandler(); var viewer=this._viewer; this.handler=new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); var scope=this; this._tip=viewer.entities.add({ id:this.id, label : { fillColor:Cesium.Color.YELLOW, showBackground : true, font : '14px monospace', horizontalOrigin : Cesium.HorizontalOrigin.LEFT, verticalOrigin : Cesium.VerticalOrigin.BOTTOM, pixelOffset : new Cesium.Cartesian2(0, -10) } }); this.state=this.BEYONANALYSER_STATE.OPERATING; this.handler.setInputAction(function (movement) { let cartesian = _self.mouseManager.piTerrainToModule(movement.position); this.state=this.BEYONANALYSER_STATE.END; var lla={}; var cartographic=Cesium.Cartographic.fromCartesian(cartesian); //获取该点地表高程 var landHeight=viewer.scene.globe.getHeight(cartographic); if(cartographic.height