/** * 创建者:王成 * 操作系统:MAC * 创建日期:2022年11月14日 * 描述:工具类 */ /* 引入Cesium */ // import * as Cesium from 'Cesium'; /* 引入草图工具 */ import { SketchViewModel } from './SketchViewModel.js' /** * 测量、图形查询、根据坐标生成图形 */ class CommonTools { /** * 默认初始化 * @param {Object} viewer 三维场景 * @param {JSON} [options] 配置项 * @param {Boolean} [options.isClear] 是否清理前期已绘制内容 * @param {Boolean} [options.isDrawPoint] 是否绘制参考点 * @param {Boolean} [options.isRetainDrawPoint] 绘制完成,是否保留绘制参考点 */ constructor(viewer, options) { this._viewer = viewer; options = options || {}; /* 配置是否绘制参考点 */ if (options.isDrawPoint) { this._isDrawPoint = options.isDrawPoint; } else { this._isDrawPoint = false; } /* 配置绘制完成是否保留绘制参考点 */ if (options.isRetainDrawPoint) { this._isRetainDrawPoint = options.isRetainDrawPoint; } else { this._isRetainDrawPoint = false; } /* 是否清理前期已绘制内容 */ if (options.isClear) { this._isClear = options.isClear; } else { this._isClear = false; } this._sketchViewModel = new SketchViewModel(viewer, { iconType: SketchViewModel.SketchIconType.Blue, isDrawPoint: this._isDrawPoint, isRetainDrawPoint: this._isRetainDrawPoint, }); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } /* 初始化 */ this._init(); } /** * 初始化 * @ignore */ _init() { /* 绘制的实体名称 */ this._measureEntityName = 'MeasureEntity'; this._entities = this._viewer.entities; /* 标绘点图片 */ this._measurePointImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcEAYAAAAinQPXAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAB2FJREFUWMO9mHtQlNcZxn/nW65GxHtEqTEajUxVoLYRSIyipHG4qG0lajtxVIRFubgqXuOI28ZE7FAvCLKLSNKxg/FSIzdvqNE62kaRitqpYMxovBGigo4I4n6nfwjsCrsLrtjnn53vnPe87/Oc9/2+854VdBhCd6ZP6dMHlAXO/lOngrzMLz/8EEQ0ASNGANNY2aOHxYIdfHr3LuBCwPnzQIKcf/AgiJ8pQV99BfmvR4+orHxZVsLxpZFT0qd07gyP7zqrej3IInF47lwQkTLV3d1xv3KXWPT4MYhLzMzIgHpn10+Sk+Gw74w+jx79HwSGnzUYhg4FED4FBcBq/jtokOOC2oSb0FZUgHpKVoeHQ9GtGM/y8lcgMLxf5juDBwNDlOWnTgGvUdWz5wsQ7c179fUWzz9y0tX1BdZPILeqCpTtil9QEOT9c876K1faWqS07XeMzJFuboCXkpaX1w5hqxl14QJIKYRWCzLV5OXtDQXbon3c3c2/TeMoYvncucAgPrl40Y7fA0zv1QtMydKwb58FL7toRwbDYo3/0utB3OD8qlX2hIkLqalwO0b9+fLlUHJOG9vQ0P4EjfyFIdPZGfqsURampIBIlxsWLLBtL/NltF4PhUIrVq92QGDIeEOmpye4pYju164Bq6n29LTiopy8tDTIL48pSExsDq/Oj9is/eAD4CRbli1DMEFUBAYCewnUaJD8jr2lpQjpJ7M2bBBi0+L47Tt2mP2G5xhNaWnAHrLj461tKF1rasA0rW5b//6w/0rigQcPWhrZKVFXP8TkybaFyb3kXbkCbiO6fpyU1Dwq58vNG3U6BJvEiYMHEcwQW8aNA3pT7O4OaPmTiwuCnlwcNQrEDRGYmytloilj5vr1Zv+mNXVhSUnmOFYEVnt6gtM9t+8mTbKlwo5AoWdySIjteWUcIwwG2LX7o6lPnkiZULTlj/7+wEThm5oKbCBeCOANUisqkNRxLCEBSSzrYmOB3jw6c8Yi3kL5K51OyvkZGXUTJz7LSH09CIPwMBpt85CHhMf48Q4IJFPofHzsbMAAJfjIEQtXC9TZWi0wkEuKAmjEyspKpNN2pyVBQULZaIjbvXmzUDb6xF0zGJCqv+no6NGAK5fLyiz8JssVcXEWgQLUsZZxWmGbrLTN057Agfh7eNiefhpRb7h922LgOzFp2DDzxnJXrsvLE0rqOW3sTz+12h4lLfRZhuQybuXmWmQkgPzhwy0o1jlV37ljh+e3/L1LF0cEXqX04UPb0075rlovLwtBHuqZ5845T5Z37UqbEAPkzOfsUvlHXZ35saFnQ4++fe04eIfftv64tEfgdvkXeweprFIvBQaaebJH+f3x4xbPvsRPnixlQlHGtDFjWq2Wuqj0yz4+QKk4FxNjMVXD2998Y0FRKEsCAuzwzBKv2eZpR6DspxQcPWpnvrNYoNNBZOTOnRoN0ilJMzYjA3ibsKoqoIxezs6gLJbpxcVSTbyePurwYSkT76VPKSgAWQslJcAmenTrBszgP7W1wBlRmZICY2SydHIC8ZCvdTo7Ak+ri44dcySDNDTs2mVufluhThoGD4bHp6or4uOb3zWJnoqwMGAVLnfuACHscHJCiFRmhISA0BMcFob52PDC/8EDkLfkR5GRQmycN8/t8mXw8O73WVwctnvdJ3SqrQXNSJeY3bttaWhHJxMxzDh97VqQAwheutR2IC6pm/z8oOBm7LcVFVJNKNo0oUsXhBKmGR0VBfI0vkFBINzExxoNEKP+ePYsktefFmVnC2Vjvm5SZSVEpGUNefNNUH8ti8rKQCziaOfOVuL2563PP4eCjJhxK1a8hMCJJ7NTPDxAXWIaefEi0J2r/ftbMfyryDhxAkZ2u1EaHAx6oReq2rb/JiTLZKkoUHLf2//YMWCGnPf++1YM7zHw+nVQ1mlKhg2DvPeiltr+GLaj2W524Kd6zZ4NhGOQ0ophI6GSkr4Gq61VGyjx7vdZQoIdYY1xVZ06RKttS1gTHLkPLjVmGo3AJZToaCsGjSWrPFBKfH3bvta0uyR3ySlGIxS4a7trte1l244MtoRpT93XSUk0l0oruFDbqROYUtQ9X3xhLr2WaBpX4+WnOTl2hHkw9eZN0Li5dLP6Dehogc1dexslK/7MynffhbNDvZXnWq9GNJWyiKC69TlphvobtWbOHNgnZonq6hdl+xL/yTQhbKUxeOtWEP9melSUFYMWJSv/IAtNprZLUu4Rf9u6FQpdo49bfRXaBQcy2BL1p+XURYtAZrLwhx+sGDSWrDpc3ZeVBbJMPt22zY6wRj/1oep08zXMUXRABpsQFmqcHhICYiLlhw4BBWiFA/5FOXmhoc8u0Pv3vyyrDshgEwqLYnKLi4FO5OfkvPh66UdudnZHCXsFAptQ96XMW7jQTsm2xAF23roFlD6NXLy4o9m8AoHFR7SxNTWgjGOsVovtxqBxXAzEbc4cKCycN+/+/Y7n88oRvjarcNYsCDtprP/+ewjvZ1xz9SpERBp3zpz5qqP/D5zQE33tptaiAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA0LTA5VDE2OjQyOjI5KzA4OjAwjRBbGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNC0wOVQxNjo0MjoyOSswODowMPxN46cAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uXzJhcHo1b3VpcnV4L2Rpbmd3ZWkuc3ZncY9vkgAAAABJRU5ErkJggg=='; this._iconBlue = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkEyMUE1MDg3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkEyMUE1MDc3NTAyMTFFREI0RUY4MjBCRjRGRDc0QUIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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'; this._iconGreen = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjI1NDIwOUU3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjI1NDIwOUQ3NTAyMTFFRDk0MTJGQzhGMTFCQkREODIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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'; this._iconViolet = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNjZmZDYyMy02NmE4LWYzNDUtODc4MC00YmMwY2IzZWM4OTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzFDREU3Mjk3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzFDREU3Mjg3NTAyMTFFREE4MThDODBGNzMxNDBCQzEiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OWFmM2ZiODktNzQ4OS1kMDRkLTkyNzUtZDM5MWNhYzYwMGE1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjM2NmZkNjIzLTY2YTgtZjM0NS04NzgwLTRiYzBjYjNlYzg5MyIv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'; /* 用于面积测量 存储临时位置 经纬度格式 */ this._measureTempPoints = []; } /** * 刷新场景 刷新一帧 * @ignore */ _updateScene() { this._viewer.scene.requestRender(); } /** * 根据Entity的名称批量删除Entity * @ignore * @param {string} entityName 实体名称 */ _removeEntityByName(entityName) { /* 获取实体集合 */ let entities = this._entities; /* 如果不存在实体集合或集合中没有数据 则返回 */ if (!entities || !entities.values) return; let delEntitys = []; /* 循环获取当前集合中的所有实体 */ for (let i = 0; i < entities.values.length; i++) { if (entities.values[i].name == entityName) { delEntitys.push(entities.values[i]); } } /* 删除符合条件的所有实体 */ for (let i = 0; i < delEntitys.length; i++) { entities.remove(delEntitys[i]); } /* 更新场景 */ this._updateScene(); } /** * 资源清理 * @ignore * @param {Boolean} isAll 是否清除已绘制内容 */ _clear(isAll) { if (isAll != undefined && isAll === true) { /* 删除所有绘制的实体 */ this._removeEntityByName(this._measureEntityName); if (this._sketchViewModel != undefined) { this._sketchViewModel.sketchClear(); } } /* 清理数组 */ this._measureTempPoints = []; /* 清理变量 */ this._altitudeDynamicLabel = undefined; /* 清理提示标签 */ this._tooltipRemove(); //app移除按钮 let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } } /** * 普通颜色值转换为Cesium颜色 * @ignore * @param {int} red 红色[0~255] * @param {int} green 绿色[0~255] * @param {int} blue 蓝色[0~255] * @param {int} alpha 透明度[0~1] * @return {Cesium.Color} Cesium格式的颜色 */ _toColor(red, green, blue, alpha) { return new Cesium.Color(red / 255.0, green / 255.0, blue / 255.0, alpha); } /** * 世界坐标系坐标转为经纬度坐标 * @ignore * @param {JSON} cartesian 世界坐标 * @param {Number} cartesian.x x坐标 * @param {Number} cartesian.y y坐标 * @param {Number} cartesian.z z坐标 * @return {JSON} 经纬度格式坐标{long:lat:hei} */ _cartesianToGeography(cartesian) { let ellipsoid = Cesium.Ellipsoid.WGS84; let cartographic = ellipsoid.cartesianToCartographic(cartesian); let latitude = Cesium.Math.toDegrees(cartographic.latitude); let longitude = Cesium.Math.toDegrees(cartographic.longitude); let altitude = cartographic.height; return { lon: longitude, lat: latitude, hei: altitude, } } /** * 绘制点 * @ignore * @param {Object} coord 坐标 * @param {Number} coord.x 空间坐标x * @param {Number} coord.y 空间坐标y * @param {Number} coord.z 空间坐标z * @param {String} label [点上面显示的文字标注] */ _createPoint(coord, label) { let _self = this; let entity = new Cesium.Entity({ name: _self._measureEntityName, position: coord, billboard: { image: _self._iconBlue, horizontalOrigin: Cesium.HorizontalOrigin.center, verticalOrigin: Cesium.VerticalOrigin.bottom, scale: 0.5, pixelOffset: new Cesium.Cartesian2(0, -11), disableDepthTestDistance: Number.POSITIVE_INFINITY, } }); if (label) { entity.label = { text: label, font: '30px SimHei', scale: 0.5, fillColor: this._toColor(255, 255, 255, 1.0), outlineColor: this._toColor(14, 30, 79, 1.0), style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2.0, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, showBackground: true, backgroundColor: _self._toColor(0, 0, 0, 0.6), disableDepthTestDistance: Number.POSITIVE_INFINITY, pixelOffset: new Cesium.Cartesian2(0, -28), } } this._entities.add(entity); this._updateScene(); return entity; } /** * 绘制标签 * @ignore * @param {Object} coord 坐标 * @param {Number} coord.x 标签空间坐标x * @param {Number} coord.y 标签空间坐标y * @param {Number} coord.z 标签空间坐标z * @param {String} label 标签文字内容 */ _createLabel(coord, label) { let _self = this; let entity = new Cesium.Entity({ name: _self._measureEntityName, position: coord, label: { text: label, font: '30px SimHei', scale: 0.5, fillColor: this._toColor(255, 255, 255, 1.0), outlineColor: this._toColor(14, 30, 79, 1.0), style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2.0, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, showBackground: true, backgroundColor: _self._toColor(0, 0, 0, 0.6), disableDepthTestDistance: Number.POSITIVE_INFINITY, pixelOffset: new Cesium.Cartesian2(0, -14), } }); this._entities.add(entity); this._updateScene(); } /** * 创建高度测量的动态Label * @ignore */ _createAltitudeDynamicLabel() { let _self = this; this._altitudeDynamicLabel = new Cesium.Entity({ name: _self._measureEntityName, position: new Cesium.CallbackProperty(function() { return _self._altitudeLabelPosition; }, false), label: { text: new Cesium.CallbackProperty(function() { return _self._altitudeLabelText; }, false), font: '12px sans-serif', fillColor: this._toColor(255, 255, 255, 1.0), outlineColor: this._toColor(0, 154, 94, 1.0), style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 1.0, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(0, -28), showBackground: true, backgroundColor: this._toColor(0, 0, 0, 0.6), disableDepthTestDistance: Number.POSITIVE_INFINITY, } }); this._entities.add(this._altitudeDynamicLabel); this._updateScene(); } /** * 计算距离 * @ignore * @param {Array} positions 点集合 * @return {string}:距离字符串(含单位) */ _measureDistance(positions) { let distance = 0; for (let i = 0; i < positions.length - 1; i++) { let point1cartographic = Cesium.Cartographic.fromCartesian(positions[i]); let point2cartographic = Cesium.Cartographic.fromCartesian(positions[i + 1]); /**根据经纬度计算出距**/ let geodesic = new Cesium.EllipsoidGeodesic(); geodesic.setEndPoints(point1cartographic, point2cartographic); let s = geodesic.surfaceDistance; /* 返回两点之间的距离 */ s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2)); distance = distance + s; } if (distance < 1000) return distance.toFixed(2) + "米"; else return (distance / 1000).toFixed(2) + "公里"; } /** * 计算空间距离 * @ignore * @param {Array} positions 点集合 * @return {string}:距离字符串(含单位) */ _measureSpaceDistance(positions) { let distance = 0; for (let i = 0; i < positions.length - 1; i++) { let point1 = positions[i]; let point2 = positions[i + 1]; /* 计算分量差 */ let sx = Math.abs(point1.x - point2.x); let sy = Math.abs(point1.y - point2.y); let sz = Math.abs(point1.z - point2.z); /* 返回两点之间的空间距离 */ let s = Math.sqrt(Math.pow(sx, 2) + Math.pow(sy, 2) + Math.pow(sz, 2)); distance = distance + s; } if (distance < 1000) return distance.toFixed(2) + "米"; else return (distance / 1000).toFixed(2) + "公里"; } /** * 计算方向 * @ignore * @param {Cartesian3} from 起始 * @param {Cartesian3} to 终止 * @return {float} 方向度数 */ _measureAreaBearing(from, to) { let radiansPerDegree = Math.PI / 180.0; //角度转化为弧度(rad) let degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度 let lat1 = from.lat * radiansPerDegree; let lon1 = from.lon * radiansPerDegree; let lat2 = to.lat * radiansPerDegree; let lon2 = to.lon * radiansPerDegree; let 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; } /** * 计算角度 * @ignore * @param {Cartesian3} p1 点1 * @param {Cartesian3} p2 点2 * @param {Cartesian3} p3 点3 * @return {float} 返回角度 */ _calculateAreaAngle(p1, p2, p3) { let bearing21 = this._measureAreaBearing(p2, p1); let bearing23 = this._measureAreaBearing(p2, p3); let angle = bearing21 - bearing23; if (angle < 0) { angle += 360; } return angle; } /** * 计算两点之间的距离 * @ignore * @param {Cartesian3} point1 点1 * @param {Cartesian3} point2 点2 */ _calculateDistance(point1, point2) { let point1cartographic = Cesium.Cartographic.fromCartesian(point1); let point2cartographic = Cesium.Cartographic.fromCartesian(point2); /**根据经纬度计算出距离**/ let geodesic = new Cesium.EllipsoidGeodesic(); geodesic.setEndPoints(point1cartographic, point2cartographic); let s = geodesic.surfaceDistance; //返回两点之间的距离 s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic .height, 2)); return s; } /** * 计算面积 * @ignore * @param {Array} cartesianPoints 空间坐标系点集合 * @return {float} 返回面积 */ _measureArea(points, cartesianPoints) { let self = this; let res = 0; /* 拆分三角面 */ for (let i = 0; i < points.length - 2; i++) { let j = (i + 1) % points.length; let k = (i + 2) % points.length; let totalAngle = self._calculateAreaAngle(points[i], points[j], points[k]); let dis_temp1 = self._calculateDistance(cartesianPoints[i], cartesianPoints[j]); let dis_temp2 = self._calculateDistance(cartesianPoints[j], cartesianPoints[k]); res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle)); } return res; } /** * 计算两个点的高度 * @ignore * @param {Array} points 点集合(集合长度必须大于等于2) */ _calculatePolylineAltitudeHeight(points) { if (points === undefined || points.length < 2) return -1; let cartographic = Cesium.Cartographic.fromCartesian(points[0]); let cartographic1 = Cesium.Cartographic.fromCartesian(points[1]); let height_temp = cartographic1.height - cartographic.height; return Math.abs(height_temp).toFixed(2) + '米'; } /** * 设置鼠标为柿子样式 * @ignore */ _setMousePointerStyle() { document.querySelector('body').style.cursor = 'crosshair'; } /** * 恢复鼠标指针为默认样式 * @ignore */ _initMousePointerStyle() { document.querySelector('body').style.cursor = 'default'; } /** * 检测程序运行环境 * @return {CommonTools.RuntimeEnvironment} */ _checkAppOrWeb() { if (window.navigator.userAgent.match( /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i )) { return CommonTools.RuntimeEnvironment.App; } else { return CommonTools.RuntimeEnvironment.Web; } } /** * 是否是运行于App * @ignore */ _isRuntimeApp() { if (this._checkAppOrWeb() === CommonTools.RuntimeEnvironment.App) { return true; } return false; } /** * 是否是运行于App * @ignore */ _isRuntimeWeb() { if (this._checkAppOrWeb() === CommonTools.RuntimeEnvironment.Web) { return true; } return false; } /** * @ignore * 创建操作的主容器 */ _createOperationMainDom() { //创建画布 let buttonDiv = document.createElement('div'); buttonDiv.id = "drawButtonDiv"; buttonDiv.style.width = '80px'; buttonDiv.style.backgroundColor = 'rgba(5, 45, 155, 0.7)'; buttonDiv.style.borderRadius = '5px'; buttonDiv.style.display = 'flex'; buttonDiv.style.flexDirection = 'column'; buttonDiv.style.padding = '8px'; buttonDiv.style.justifyContent = 'center'; buttonDiv.style.position = 'absolute'; buttonDiv.style.bottom = '150px'; buttonDiv.style.right = '10px'; let btnUndo = document.createElement('button'); btnUndo.id = "btnDrawBackout"; btnUndo.style.height = '30px'; btnUndo.style.marginBottom = '8px'; btnUndo.style.backgroundColor = 'rgba(52, 137, 255, 1.0)'; btnUndo.style.color = 'rgb(255, 255, 255)'; btnUndo.style.border = '0px solid red'; btnUndo.style.borderRadius = '5px'; btnUndo.innerHTML = '回退'; btnUndo.style.fontSize = '13px'; btnUndo.style.cursor = 'pointer'; buttonDiv.appendChild(btnUndo); let btnCompletion = document.createElement('button'); btnCompletion.id = "btnDrawComplete"; btnCompletion.style.height = '30px'; btnCompletion.style.backgroundColor = 'rgba(88, 185, 45, 1.0)'; btnCompletion.style.color = 'rgb(255, 255, 255)'; btnCompletion.style.border = '0px solid red'; btnCompletion.style.borderRadius = '5px'; btnCompletion.innerHTML = '完成'; btnCompletion.style.fontSize = '13px'; btnCompletion.style.cursor = 'pointer'; buttonDiv.appendChild(btnCompletion); /* 加入到页面 */ document.body.appendChild(buttonDiv); } /** * 创建顶部弹出提示消息 1秒后自动消失 * @ignore * @param {String} message 消息内容 */ _showTooltipMessage(message) { let msgMainDom = document.getElementById('messageMainDom'); if (msgMainDom !== null && msgMainDom !== undefined) { document.body.removeChild(msgMainDom); } msgMainDom = document.createElement('div'); msgMainDom.style.width = '30%'; msgMainDom.style.backgroundColor = 'rgba(237, 248, 230, 1.0)'; msgMainDom.style.height = '45px'; msgMainDom.style.border = 'solid 2px rgb(219, 241, 208)'; msgMainDom.style.borderRadius = '8px'; msgMainDom.style.display = 'flex'; msgMainDom.style.alignItems = 'center'; msgMainDom.style.paddingLeft = '10px'; msgMainDom.style.color = 'rgb(91, 188, 48)'; msgMainDom.style.fontSize = '14px'; msgMainDom.style.fontWeight = '600'; msgMainDom.style.position = 'absolute'; msgMainDom.style.left = '35%'; msgMainDom.style.transition = 'transform 1s'; msgMainDom.style.transform = 'translateY(-90px)'; msgMainDom.style.top = '0px'; msgMainDom.style.zIndex = 1000; document.body.appendChild(msgMainDom); let strHtml = ''; strHtml += "
"; strHtml += "
" + message + "
"; msgMainDom.innerHTML = strHtml; msgMainDom.addEventListener('transitionend', function() { setTimeout(function() { document.body.removeChild(msgMainDom); }, 1000); }, false); setTimeout(function() { msgMainDom.style.transform = 'translateY(50px)'; }, 100) } } /** * 鼠标跟随标签 */ Object.assign(CommonTools.prototype, { /** * 提示标签初始化 * @ignore * @param {String} text 显示的文本内容 */ _tooltipInit: function(text) { let _self = this; this._tooltipId = 'tooltipJt'; let tooltipObj = document.getElementById(this._tooltipId); if (tooltipObj === null) { tooltipObj = document.createElement('div'); tooltipObj.id = this._tooltipId; document.body.appendChild(tooltipObj); let divStyle = ''; divStyle += "top: 30px;"; divStyle += "left: 30px;"; divStyle += "position: absolute;"; divStyle += "display: flex;"; divStyle += "align-items: center;"; divStyle += "width: 12x0px;"; divStyle += "height: auto;"; divStyle += "background-color: rgba(0, 0, 0, 0.65);"; divStyle += "border-radius: 5px;"; divStyle += "color: rgb(255, 255, 255);"; divStyle += "font-size: 12px;"; divStyle += "font-family: 'Alimama_ShuHeiTi_Bold';"; divStyle += "padding: 8px;"; divStyle += "border:solid 1px rgb(255,0,0);"; tooltipObj.setAttribute('style', divStyle); } if (text != undefined) tooltipObj.innerHTML = text; /* 挂接鼠标移动事件 */ document.onmousemove = function(event) { tooltipObj.style.left = (event.clientX + 10) + 'px'; tooltipObj.style.top = (event.clientY - tooltipObj.offsetHeight / 2) + 'px'; } }, /** * 移除提示标签 * @ignore */ _tooltipRemove: function() { let tooltipObj = document.getElementById(this._tooltipId); if (tooltipObj != null) { document.body.removeChild(tooltipObj); } }, /** * 设置提示标签文本 * @ignore * @param {String} text 文本 */ _tooltipSetText: function(text) { let tooltipObj = document.getElementById(this._tooltipId); if (tooltipObj != null) { tooltipObj.innerHTML = text; } } }) /** * 通用对外公开函数 */ Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ { /** * 清理资源 */ clear: function() { /* 清理资源 */ this._clear(true); /* 初始化鼠标样式 */ this._initMousePointerStyle(); } }) /** * 测量类对外公开函数 */ Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ { /** * 测量长度 */ measureLength: function(callError) { let _self = this; /* 临时创建的实体 */ this._tempEntitys = []; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置鼠标跟随 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始测量"); } else { this._tooltipInit('点击开始测量'); } /* 调用草图开始绘制 */ if (this._isRuntimeWeb()) { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { _self._createPoint(cPoints[0], '起点'); } else { let distince = _self._measureDistance(cPoints); /* 追加中间距离 */ let tempPoints = [cPoints[cPoints.length - 2], cPoints[cPoints.length - 1]]; distince += ' +' + _self._measureDistance(tempPoints); _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince)); } }, /** * 撤销回调 * @ignore */ onUndo: function() { _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]); _self._tempEntitys.pop(); }, /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint * @param {JSON} scPoint 屏幕点 */ onMoving: function(cPoint, scPoint) { _self._tooltipSetText('右键单击回退
左键双击结束绘制'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { _self._initMousePointerStyle(); _self._tooltipRemove(); } }); } else { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { // 移除提示标签 _self._tooltipRemove(); _self._createPoint(cPoints[0], '起点'); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv == null) { //创建按钮 _self._createOperationMainDom(); //撤销 document.getElementById("btnDrawBackout").onclick = () => { if (_self._sketchViewModel._sketchTempPoints.length > 2) { /* 移除正式点最有一个元素 */ _self._sketchViewModel._sketchPoints.pop(); /* 移除临时点倒数第二个元素 */ _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1); /* 如果绘制了点 则删除最后一个 */ if (_self._sketchViewModel._isDrawPoint) { let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1]; _self._sketchViewModel._entities.remove(lastPointEntity); /* 移除点实体数据中的最后一条数据 */ _self._sketchViewModel._pointEntitys.pop(); } _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]); _self._tempEntitys.pop(); } } //完成绘制 document.getElementById("btnDrawComplete").onclick = () => { if (_self._sketchViewModel._sketchPoints.length < 2) { if (callError) callError("点数少于两个,禁止结束绘制!"); return; } /* 删除临时线 */ _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline); /* 绘制正式线 */ _self._sketchViewModel._createPolyline(); /* 删除标记点 */ if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys(); /* 干掉事件句柄 释放资源*/ _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler); _self._initMousePointerStyle(); _self._tooltipRemove(); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } } } } else { let distince = _self._measureDistance(cPoints); /* 追加中间距离 */ let tempPoints = [cPoints[cPoints.length - 2], cPoints[cPoints.length - 1]]; distince += ' +' + _self._measureDistance(tempPoints); _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince)); } }, }); } }, /** * 空间距离测量 */ measureSpatialLength: function(callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始测量"); } else { this._tooltipInit('点击开始测量'); } /* 临时创建的实体 */ this._tempEntitys = []; /* 调用草图开始绘制 */ if (this._isRuntimeWeb()) { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Spatial, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { _self._createPoint(cPoints[0], '起点'); } else { let distince = _self._measureSpaceDistance(cPoints); _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince)); } }, /** * 撤销回调 * @ignore */ onUndo: function() { _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]); _self._tempEntitys.pop(); }, /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint * @param {JSON} scPoint 屏幕点 */ onMoving: function(cPoint, scPoint) { _self._tooltipSetText('右键单击回退
左键双击结束绘制'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { _self._initMousePointerStyle(); _self._tooltipRemove(); } }); } else { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Spatial, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { // 移除提示标签 _self._tooltipRemove(); _self._createPoint(cPoints[0], '起点'); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv == null) { //创建按钮 _self._createOperationMainDom(); //撤销 document.getElementById("btnDrawBackout").onclick = () => { if (_self._sketchViewModel._sketchTempPoints.length > 2) { /* 移除正式点最有一个元素 */ _self._sketchViewModel._sketchPoints.pop(); /* 移除临时点倒数第二个元素 */ _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1); _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]); _self._tempEntitys.pop(); } } //完成绘制 document.getElementById("btnDrawComplete").onclick = () => { if (_self._sketchViewModel._sketchPoints.length < 2) { if (callError) callError("点数少于两个,禁止结束绘制!"); return; } /* 删除临时空间线 */ _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempSpatialPolyline); /* 绘制正式空间线 */ _self._sketchViewModel._createSpatialPolyline(); /* 删除标记点 */ _self._sketchViewModel._removePointEntitys(); /* 干掉事件句柄 释放资源*/ _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler); _self._initMousePointerStyle(); _self._tooltipRemove(); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } } } } else { let distince = _self._measureSpaceDistance(cPoints); _self._tempEntitys.push(_self._createPoint(cPoints[cPoints.length - 1], distince)); } }, }); } }, /** * 测量面积 */ measureArea: function(callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示工具 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始测量"); } else { this._tooltipInit('点击开始测量'); } var _areaLabel = ""; //面积提示 /* 调用草图开始绘制 */ if (this._isRuntimeWeb()) { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { _self._measureTempPoints.push(_self._cartesianToGeography(cPoints[cPoints.length - 1])); if (cPoints.length === 1) { _areaLabel = '起点'; var areaLabel = _self._createPoint(cPoints[0], new Cesium.CallbackProperty(function() { var lable = _areaLabel return lable; }, false)); } else if (cPoints.length >= 3) { let area = _self._measureArea(_self._measureTempPoints, cPoints); if (area > 100000) { _areaLabel = (area / 100000).toFixed(2) + "km²"; } else { _areaLabel = area.toFixed(2) + "m²"; } } }, /** * 撤销回调 * @ignore */ onUndo: function() { _self._measureTempPoints.pop(); if (_self._measureTempPoints.length === 1) _self._areaLabel = "起点"; }, /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint * @param {JSON} scPoint 屏幕点 */ onMoving: function(cPoint, scPoint) { _self._tooltipSetText('右键单击回退
左键双击结束绘制'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { _self._initMousePointerStyle(); _self._tooltipRemove(); } }); } else { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { _self._measureTempPoints.push(_self._cartesianToGeography(cPoints[cPoints.length - 1])); if (cPoints.length === 1) { // 移除提示标签 _self._tooltipRemove(); _areaLabel = '起点'; var areaLabel = _self._createPoint(cPoints[0], new Cesium.CallbackProperty(function() { var lable = _areaLabel return lable; }, false)); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv == null) { //创建按钮 _self._createOperationMainDom(); //撤销 document.getElementById("btnDrawBackout").onclick = () => { if (_self._sketchViewModel._sketchTempPoints.length > 2) { /* 移除正式点最有一个元素 */ _self._sketchViewModel._sketchPoints.pop(); /* 移除临时点倒数第二个元素 */ _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1); /* 如果绘制了点 则删除最后一个 */ if (_self._sketchViewModel._isDrawPoint) { let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1]; _self._entities.remove(lastPointEntity); /* 移除点实体数据中的最后一条数据 */ _self._sketchViewModel._pointEntitys.pop(); } _self._measureTempPoints.pop(); if (_self._measureTempPoints.length === 1) _self._areaLabel = "起点"; } } //完成绘制 document.getElementById("btnDrawComplete").onclick = () => { if (_self._sketchViewModel._sketchPoints.length < 3) { if (callError) callError("点数少于3个,禁止结束绘制!"); return; } /* 删除临时线和面 */ _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolygon); _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline); /* 绘制正式面 */ _self._sketchViewModel._createPolygon(); /* 删除标记点 */ if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys(); /* 干掉事件句柄 释放资源*/ _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler); _self._initMousePointerStyle(); _self._tooltipRemove(); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } } } } else if (cPoints.length >= 3) { let area = _self._measureArea(_self._measureTempPoints, cPoints); if (area > 100000) { _areaLabel = (area / 100000).toFixed(2) + "km²"; } else { _areaLabel = area.toFixed(2) + "m²"; } } }, }); } }, /** * 高度测量 */ measureHeight: function(callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制线"); } else { this._tooltipInit('单击开始绘制线'); } /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Height, { /** * 添加回调 * @ignore * @param {Cesium.Cartesian3} cPoint 点 */ onAdded: function(cPoint) { if (_self._isRuntimeApp()) { _self._showTooltipMessage("再次点击结束测量"); } else { _self._tooltipSetText('再次单击结束测量'); } }, /** * 移动回调 * @ignore * @param {Array} cPoints 高度线集合 * @param {Cesium.Cartesian3} centerPoint 顶端中心点 */ onMoving: function(cPoints, centerPoint) { let height = _self._calculatePolylineAltitudeHeight(cPoints); _self._altitudeLabelPosition = centerPoint; _self._altitudeLabelText = height; if (_self._altitudeDynamicLabel === undefined) { _self._createAltitudeDynamicLabel(); } }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} Points 高度线集合 * @param {Cesium.Cartesian3} centerPoint 顶端中心点 */ onComplete: function(cPoints, centerPoint) { let height = _self._calculatePolylineAltitudeHeight(cPoints); /* 干掉临时创建的 */ _self._entities.remove(_self._altitudeDynamicLabel); /* 创建正式的 */ _self._createLabel(centerPoint, height); /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); } }); }, /** * 三角测量 */ measureTriangle: function(callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制线"); } else { this._tooltipInit('单击开始绘制线'); } /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Triangle, { /** * 添加回调 * @ignore * @param {Cesium.Cartesian3} cPoint 点 */ onAdded: function(cPoint) { if (_self._isRuntimeApp()) { _self._showTooltipMessage("再次点击结束测量"); } else { _self._tooltipSetText('再次单击结束测量'); } }, /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint 当前点 */ onMoving: function(cPoint) { _self._tooltipSetText('再次单击结束测量'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * @ignore * @param {Cesium.Cartesian3} positions 高度顶端中心点坐标 */ onComplete: function(positions) { /* 恢复鼠标初始样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 倾斜距离点集合 */ let sPoints = [positions[0], positions[1]]; let sDistince = _self._measureSpaceDistance(sPoints); /* 平面距离点集合 */ let hPoints = [positions[1], positions[2]]; let hDistince = _self._measureSpaceDistance(hPoints); /* 高度点*/ let hePoints = [positions[2], positions[0]]; let height = _self._calculatePolylineAltitudeHeight(hePoints); /* 创建正式的 */ _self._createLabel(positions[0], '斜距:' + sDistince); _self._createLabel(positions[1], '平距:' + hDistince); _self._createLabel(positions[2], '高度:' + height); } }); } }) /** * 查询工具类对外公开函数 */ Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ { /** * 点查询 * @param {String} callComplete 成功回调callComplete(coordinates) */ queryByPoint: function(callComplete) { let _self = this; /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标跟随 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击位置进行查询"); } else { this._tooltipInit('单击位置进行查询'); } /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Point, { /** * 完成回调 * @ignore * @param {Cesium.Cartesian3} cPoint 世界坐标系点 * @param {JSON} gPoint 经纬度坐标系点 */ onComplete: function(cPoint, gPoint) { /* 重置鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); _self._createPoint(cPoint); let coordinates = gPoint.lng + ',' + gPoint.lat; if (callComplete) callComplete(coordinates); }, }); }, /** * 多点查询 * @param {String} callComplete 成功回调callComplete(Array) */ queryByMultiplePoint: function(callComplete) { let _self = this; /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标跟随 */ this._tooltipInit("点击位置绘制
左键双击结束绘制"); /* 临时创建的实体 */ this._tempEntitys = []; /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.MultiplePoint, { /** * 添加回调 * @ignore * @param {Cesium.Cartesian3} cPoint 世界坐标系点 * @param {JSON} gPoint 经纬度坐标系点 */ onAdded: function(cPoint, gPoint) { let res = gPoint.lng.toFixed(6) + "," + gPoint.lat.toFixed(6); _self._tempEntitys.push(_self._createPoint(cPoint, res)); }, /** * 撤销回调 * @ignore */ onUndo: function() { _self._viewer.entities.remove(_self._tempEntitys[_self._tempEntitys.length - 1]); _self._tempEntitys.pop(); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { /* 重置鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回字符串数组 */ let res = []; for (let i = 0; i < gPoints.length; i++) { res.push(gPoints[i].lng); res.push(gPoints[i].lat); } if (callComplete) callComplete(res); }, }); }, /** * 线查询 * @param {String} callComplete 成功回调callComplete(coordinates) * @param {String} callError 失败回调callError(error) */ queryByLine: function(callComplete, callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制线"); } else { this._tooltipInit('单击开始绘制线'); } /* 调用草图开始绘制 */ if (this._isRuntimeWeb()) { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { }, /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint * @param {JSON} scPoint 屏幕点 */ onMoving: function(cPoint, scPoint) { _self._tooltipSetText('右键单击回退
左键双击结束绘制开始查询'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回坐标串 */ let coordinates = undefined; for (let i = 0; i < gPoints.length; i++) { let point = gPoints[i]; if (coordinates === undefined) coordinates = point.lng + ',' + point.lat; else coordinates += ',' + point.lng + ',' + point.lat; } if (callComplete) callComplete(coordinates); }, }); } else { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Line, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { /* 移除提示标签 */ _self._tooltipRemove(); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv == null) { //创建按钮 _self._createOperationMainDom(); //撤销 document.getElementById("btnDrawBackout").onclick = () => { if (_self._sketchViewModel._sketchTempPoints.length > 2) { /* 移除正式点最有一个元素 */ _self._sketchViewModel._sketchPoints.pop(); /* 移除临时点倒数第二个元素 */ _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1); /* 如果绘制了点 则删除最后一个 */ if (_self._sketchViewModel._isDrawPoint) { let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1]; _self._sketchViewModel._entities.remove(lastPointEntity); /* 移除点实体数据中的最后一条数据 */ _self._sketchViewModel._pointEntitys.pop(); } } } //完成绘制 document.getElementById("btnDrawComplete").onclick = () => { if (_self._sketchViewModel._sketchPoints.length < 2) { if (callError) callError("点数少于两个,禁止结束绘制!"); return; } /* 删除临时线 */ _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline); /* 绘制正式线 */ _self._sketchViewModel._createPolyline(); /* 删除标记点 */ if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys(); /* 干掉事件句柄 释放资源*/ _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler); /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回坐标串 */ let coordinates = undefined; for (let i = 0; i < gPoints.length; i++) { let point = gPoints[i]; if (coordinates === undefined) coordinates = point.lng + ',' + point.lat; else coordinates += ',' + point.lng + ',' + point.lat; } let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } if (callComplete) callComplete(coordinates); } } } }, }); } }, /** * 区域查询 * @param {String} callComplete 成功回调callComplete(coordinates) * @param {String} callError 失败回调callError(error) */ queryByPolygon: function(callComplete, callError) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制区域"); } else { this._tooltipInit('单击开始绘制区域'); } /* 调用草图开始绘制 */ if (this._isRuntimeWeb()) { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, { /** * 移动回调 * @ignore * @param {Cesium.Cartesian3} cPoint * @param {JSON} scPoint 屏幕点 */ onMoving: function(cPoint, scPoint) { _self._tooltipSetText('右键单击回退
左键双击结束绘制开始查询'); }, /** * 错误回调 * @ignore * @param {String} error 错误信息 */ onError: function(error) { if (callError) callError(error); }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { /* 重置鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回坐标串 */ let coordinates = undefined; for (let i = 0; i < gPoints.length; i++) { let point = gPoints[i]; if (coordinates === undefined) coordinates = point.lng + ',' + point.lat; else coordinates += ',' + point.lng + ',' + point.lat; } coordinates += ',' + gPoints[0].lng + ',' + gPoints[0].lat; if (callComplete) callComplete(coordinates); }, }); } else { this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Polygon, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 1) { // 移除提示标签 _self._tooltipRemove(); let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv == null) { //创建按钮 _self._createOperationMainDom(); //撤销 document.getElementById("btnDrawBackout").onclick = () => { if (_self._sketchViewModel._sketchTempPoints.length > 2) { /* 移除正式点最有一个元素 */ _self._sketchViewModel._sketchPoints.pop(); /* 移除临时点倒数第二个元素 */ _self._sketchViewModel._sketchTempPoints.splice(_self._sketchViewModel._sketchTempPoints.length - 1, 1); /* 如果绘制了点 则删除最后一个 */ if (_self._sketchViewModel._isDrawPoint) { let lastPointEntity = _self._sketchViewModel._pointEntitys[_self._sketchViewModel._pointEntitys.length - 1]; _self._entities.remove(lastPointEntity); /* 移除点实体数据中的最后一条数据 */ _self._sketchViewModel._pointEntitys.pop(); } } } //完成绘制 document.getElementById("btnDrawComplete").onclick = () => { if (_self._sketchViewModel._sketchPoints.length < 3) { if (callError) callError("点数少于3个,禁止结束绘制!"); return; } /* 删除临时线和面 */ _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolygon); _self._sketchViewModel._removeEntityByObject(_self._sketchViewModel._sketchTempPolyline); /* 绘制正式面 */ _self._sketchViewModel._createPolygon(); /* 删除标记点 */ if (!_self._sketchViewModel._isRetainDrawPoint) _self._sketchViewModel._removePointEntitys(); /* 干掉事件句柄 释放资源*/ _self._sketchViewModel._clearEvent(_self._sketchViewModel._sketchEventHandler); /* 重置鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回坐标串 */ let coordinates = undefined; for (let i = 0; i < gPoints.length; i++) { let point = gPoints[i]; if (coordinates === undefined) coordinates = point.lng + ',' + point.lat; else coordinates += ',' + point.lng + ',' + point.lat; } coordinates += ',' + gPoints[0].lng + ',' + gPoints[0].lat; let buttonDiv = document.getElementById("drawButtonDiv"); if (buttonDiv) { //从页面移除 document.body.removeChild(buttonDiv); } if (callComplete) callComplete(coordinates); } } } }, }); } }, /** * 圆查询 * @param {String} callComplete 成功回调callComplete(center,radius) */ queryByCircle: function(callComplete) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制圆"); } else { this._tooltipInit('单击开始绘制圆'); } /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Circle, { /** * 添加回调 * @ignore * @param {JSON} center 中心点 */ onAdded: function(center) { if (_self._isRuntimeApp()) { _self._showTooltipMessage("再次点击结束绘制"); } else { _self._tooltipInit('再次单击结束绘制'); } }, /** * 完成回调 * @ignore * @param {JSON} center 中心点 * @param {Number} radius 半径 */ onComplete: function(center, radius) { /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回圆心坐标及半径 */ if (callComplete) callComplete(center.lng + "," + center.lat, radius); }, }); }, /** * 矩形查询 * @param {String} callComplete 成功回调callComplete(coordinates) */ queryByRectangle: function(callComplete) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ if (this._isRuntimeApp()) { this._showTooltipMessage("点击开始绘制矩形"); } else { this._tooltipInit('单击开始绘制矩形'); } /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.Rectangle, { /** * 添加回调 * @ignore * @param {JSON} center 中心点 */ onAdded: function(center) { if (_self._isRuntimeApp()) { _self._showTooltipMessage("再次点击结束绘制"); } else { _self._tooltipInit('再次单击结束绘制'); } }, /** * 完成回调 * @ignore * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(gPoints) { /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 返回坐标串 */ let coordinates = undefined; for (let i = 0; i < gPoints.length; i++) { let point = gPoints[i]; if (coordinates === undefined) coordinates = point.lng + ',' + point.lat; else coordinates += ',' + point.lng + ',' + point.lat; } if (callComplete) callComplete(coordinates); }, }); }, }) /** * 根据坐标绘制相关图形对外公开函数 */ Object.assign(CommonTools.prototype, /** @lends CommonTools.prototype */ { /** * 绘制面拉伸体 * @param {String} callComplete 成功回调callComplete() */ drawPolygonBody: function(callComplete) { let _self = this; /* 清理资源 */ this._clear(this._isClear); /* 设置鼠标样式 */ this._setMousePointerStyle(); /* 设置提示标签 */ this._tooltipInit('点击开始绘制'); /* 调用草图开始绘制 */ this._sketchViewModel.sketchTools(SketchViewModel.SketchType.PolygonBody, { /** * 添加点回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onAdded: function(cPoints, gPoints) { if (cPoints.length === 0) { _self._tooltipInit('点击开始绘制'); } else if (cPoints.length < 3) { _self._tooltipInit('右键单击回退'); } else { _self._tooltipInit('右键单击回退
左键双击结束绘制'); } }, /** * 撤销回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 */ onUndo: function(cPoints) { if (cPoints.length === 0) { _self._tooltipInit('点击开始绘制'); } else if (cPoints.length < 3) { _self._tooltipInit('右键单击回退'); } else { _self._tooltipInit('右键单击回退
左键双击结束绘制'); } }, /** * 完成回调 * @ignore * @param {Array} cPoints 世界坐标系点集合 * @param {Array} gPoints 球面坐标系点集合 */ onComplete: function(cPoints, gPoints) { /* 恢复鼠标样式 */ _self._initMousePointerStyle(); /* 移除提示标签 */ _self._tooltipRemove(); /* 回调 */ if (callComplete) callComplete(); }, }); }, /** * @param {Array} points 经纬度点集合 * @param {JSON} options 回调配置 * @param {Function} options.onComplete() 完成回调,可选 * @param {Function} options.onError(message) 错误回调 */ drawPointFeacture: function(points, options) { this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPoint, options); }, /** * @param {Array} points 经纬度点集合 * @param {JSON} options 回调配置 * @param {Function} options.onComplete() 完成回调,可选 * @param {Function} options.onError(message) 错误回调 */ drawMultiplePointFeacture: function(points, options) { this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawMultiplePoint, options); }, /** * @param {Array} points 经纬度点集合 * @param {JSON} options 回调配置 * @param {Function} options.onComplete() 完成回调,可选 * @param {Function} options.onError(message) 错误回调 */ drawPolylineFeacture: function(points, options) { this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPolyline, options); }, /** * @param {Array} points 经纬度点集合 * @param {JSON} options 回调配置 * @param {Function} options.onComplete() 完成回调,可选 * @param {Function} options.onError(message) 错误回调 */ drawPolygonFeacture: function(points, options) { this._sketchViewModel.sketchDrawFeacture(points, SketchViewModel.SketchType.DrawPolygon, options); } }) /* 鼠标移动标签工具 */ Object.assign(CommonTools.prototype, { /** * 提示标签初始化 * @ignore * @param {String} text 显示的文本内容 */ tooltipInit: function(text) { this._tooltipInit(text); }, /** * 移除提示标签 * @ignore */ tooltipRemove: function() { this._tooltipRemove(); }, /** * 设置提示标签文本 * @ignore * @param {String} text 文本 */ tooltipSetText: function(text) { this._tooltipSetText(text); } }); /* 其他工具 */ Object.assign(CommonTools.prototype, { /** * 拾取通过面对象拉伸绘制的体 * @ignore * @param {Function} callComplete 完成回调callComplete({color:height})拾取失败或者未拾取则返回undefined */ pickPolygonBody: function(callComplete) { let _self = this; this._sketchViewModel.sketchPick(function(options) { if (options === undefined) { if (callComplete) callComplete(undefined); } else { if (callComplete) callComplete({ color: options.color, height: options.height, }); } }) }, /** * 设置拾取的体对象样式及高度 * @ignore * @param {JSON} options 配置项 * @param {Array} options.color 颜色[0~~255,0~255,0~255,0~1] * @param {Number} options.height 高度 * @param {Function} options.onComplete(message) 完成回调,如果message为undefined则代表成功,否则为失败消息 */ setPolygonBody: function(options) { this._sketchViewModel.sketchEditPickPolygonBody({ color: options.color, height: options.height, onComplete: options.onComplete }) }, /** * 移除拾取的体对象 * @ignore * @param {Function} onComplete(message) 完成回调,message为undifined为成功,否则为失败消息 */ removePolygonBody: function(onComplete) { this._sketchViewModel.sketchRemovePickPolygonBody(onComplete); } }) /** * 运行环境类型 */ CommonTools.RuntimeEnvironment = Object.freeze(({ App: 'app', Web: 'web' })) /* 输出 */ export default CommonTools