<!--suppress ALL --> <template> <div> <!--筛选条件--> <div class="map-search-div"> <el-form ref="selectForm" :inline="true" :model="listQuery" class="form-container"> <el-row> <el-form-item> <el-input v-model.trim="listQuery.keywords" placeholder="水表检查井编号/地址" clearable size="small"/> </el-form-item> <!--<el-form-item>--> <!--<el-select v-model="listQuery.wellType" placeholder="选择井类型" @change="changetype" clearable size="small">--> <!--<el-option--> <!--v-for="item in wellTypeList"--> <!--:key="'welltype_'+item.value"--> <!--:label="item.name"--> <!--:value="item.value"/>--> <!--</el-select>--> <!--</el-form-item>--> <el-button class="filter-item" type="primary" icon="el-icon-search" @click="getWellList" size="small" style="margin-top: 2px">搜索</el-button> <el-form-item style="margin-left:10px"> <el-checkbox v-model="showAll">显示全部井</el-checkbox> </el-form-item> <el-form-item > <el-slider v-model="alpha" style="width: 150px"></el-slider> </el-form-item> <el-form-item style="margin-left:5px"> <el-button type="primary" size="small" icon="el-icon-map-location" circle @click="flytoinit"/> </el-form-item> </el-row> </el-form> </div> <div v-if="refreshType=='websocket'" class="function-div"> <el-button :type="showAlarm?'danger':'info'" icon="el-icon-bell" circle @click="showAlarm=!showAlarm"/> <!--<el-button type="primary" icon="el-icon-refresh-right" circle @click="refreshAlarm"/>--> </div> <div v-if="showAlarm==true && alarmList.length>0" class="map-alarm-div"> <div class="map-alarm-div-header"> 告警列表 <span class="icon-right" @click="tableShow=!tableShow"> <i v-if="tableShow" class="el-icon-arrow-up"/> <i v-else class="el-icon-arrow-down"/> </span> </div> <transition name="el-collapse-transition"> <el-scrollbar v-show="tableShow" :style="{visibility: tableShow?'visible':'hidden'}" :class="{moredatascollor:alarmList.length>6}" :native="false"> <el-table :data="alarmList" class="alarm-list-table" border @row-dblclick="alarmRowClick"> <el-table-column v-for="column in columns" :key="column.value" :label="column.text" :width="column.width" :align="column.align" show-overflow-tooltip> <template slot-scope="scope"> {{ scope.row[column.value] }} </template> </el-table-column> </el-table> </el-scrollbar> </transition> </div> <div id="mars3dContainer" class="mars3d-container"/> <div class="cover"/> </div> </template> <script> import { mapGetters } from 'vuex' import SelectTree from '@/components/SelectTree/singleSelect' import { getWellType } from '@/api/well' import { getWellList, getWellInfo, getAlarmsNow, getWellAlarms, getWellByCode } from '@/api/overview' import DeptSelect from '../../components/DeptSelect/index' import 'mars3d/dist/mars3d.css' import * as mars3d from 'mars3d' import 'cesium/Source/Widgets/widgets.css'// 导入必须的样式表 var Cesium = require('../../../node_modules/cesium/Source/Cesium') var rectangle = null var alarmIcons= [] var typeList = [] var ysline= null var wsline= null var underground= null var img_layer= null var tile_layer= null var tiles3dLayer= null var rain_point_layer= null var rain_point_layer1= null var sewage_point_layer= null var alarm_layer= null var fly_layer= null export default { name: 'OverviewSimple', components: { DeptSelect, SelectTree }, data() { return { type: 'massMarkers', // 加载数据方式:massMarkers或cluster refreshType: 'websocket', // 刷新数据方式:clock或websocket showAlarm: true, // 是否显示报警 showAll: false, // 是否显示全部井 alpha: 40, // 是否显示全部井 listQuery: { keywords: '', // 关键字 wellType: '', // 井类型 // deptid: '', // 组织机构 // isAlarm: '1' // 是否报警 }, // 筛选条件 columns: [ { text: '水表检查井编号', value: 'wellCode', width: 220, align: 'center' }, { text: '设备编号', value: 'devcode', width: 120, align: 'center' }, { text: '告警原因', value: 'alarmContent', align: 'center', width: 120 }, { text: '时间', value: 'alarmTime', width: 160, align: 'center' } ], // 告警列表显示列 tableShow: true, // 是否显示告警列表 tableIcon: 'el-icon-arrow-up', showWellType: this.showWellType(), // 是 否显示井类型下拉 wellTypeList: [], // 井类型列表 showDeptTree: 0, // 是否显示权属单位下拉,0不显示,1显示树,2显示平面 center: [this.$store.getters.lng, this.$store.getters.lat], // 地图中心 zoom: 12, // 地图缩放比例 alarmList: [], // 报警列表 alarmInfo: { wellCode: '', deptName: '', position: '', deep: '', alarms: [] }, // 显示报警详情气泡内容 timer :null, currentWindow: { visible: false, // 窗体显示与否 position: [this.$store.getters.lng, this.$store.getters.lat], windowType: 'info' // 窗体类型:详情info或报警alarm }, // 当前窗体属性 deptShowTop: false, // 是否显示顶级 clock: null, // 计时器 hasAlarm: false, // 是否有报警, loading: true, // 加载图标是否显示 trackPopUp:false, removeHandler:null, showClearBtn: false // 是否显示清除查询按钮 } }, computed: { ...mapGetters([ 'needRefresh' ]) }, mounted() { this.initmars3d() }, watch: { alpha(val){ // img_layer.alpha = val/100 //删 // ysline.alpha = val/100 // wsline.alpha = val/100 window.map.basemap.opacity = val/100 // this.tiles3dLayer.opacity = val/100 //删 underground.alpha = val/100 if(val<=90 && window.map.level>=19){ // window.map.scene.globe.show = false // ysline.show = false wsline.show = false }else { // window.map.scene.globe.show = true // ysline.show = true wsline.show = true } }, showAll(val) { tile_layer.show = val }, // needRefresh(val) { // // 需要刷新 // if (val) { // this.refreshAlarm() // } // }, showAlarm(val){ if(!val && this.currentWindow.windowType=='alarm'){ this.currentWindow.visible = false } alarm_layer.show = val } }, created() { this.fetchWellType() }, computed: { handler() { return new Cesium.ScreenSpaceEventHandler(window.map.scene.canvas) } }, methods: { changetype(){ if(this.listQuery.wellType==='1'){ // 雨水 rain_point_layer.show = true rain_point_layer1.show = true sewage_point_layer.show = false }else if(this.listQuery.wellType==='2'){ //污水 rain_point_layer.show = false rain_point_layer1.show = false sewage_point_layer.show = true }else{ rain_point_layer.show = true rain_point_layer1.show = true sewage_point_layer.show = true } }, async initpoints(str) { // if(sewage_point_layer!==null) window.map.removeLayer(sewage_point_layer) // if(rain_point_layer!==null) window.map.removeLayer(rain_point_layer) // if(rain_point_layer1!==null) window.map.removeLayer(rain_point_layer1) // sewage_point_layer = new mars3d.layer.ArcGisWfsLayer({ // name: '污水点', // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/3', // where: str, // minimumLevel: 19, // symbol: { // type: 'modelP', // styleOptions: { // url: '../static/model/ws3(1).gltf', // scale: 1.3 // }, // callback: function (attr, styleOpt){ // var val= {attr}.attr // return {setHeight: -val.井深} // } // }, // popup: '编号:{编号}<br />名称:{附属物名称}<br />所属道路:{所属道路}', // }) // window.map.addLayer(sewage_point_layer) // // rain_point_layer = new mars3d.layer.ArcGisWfsLayer({ // name: '雨水井', // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/0', // where: "附属物名称 = '雨水井' and " + str, // minimumLevel: 19, // symbol: { // type: 'modelP', // styleOptions: { // url: '../static/model/ys3.gltf', // scale: 1.3 // }, // callback: function (attr, styleOpt){ // var val= {attr}.attr // return {setHeight: -val.井深} // } // }, // popup: '编号:{编号}<br />名称:{附属物名称}<br />所属道路:{所属道路}', // }) // window.map.addLayer(rain_point_layer) // // rain_point_layer1 = new mars3d.layer.ArcGisWfsLayer({ // name: '雨篦', // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/0', // where: "附属物名称 <> '雨水井' and " + str, // minimumLevel: 19, // symbol: { // type: 'modelP', // styleOptions: { // url: '../static/model/yubi.gltf', // scale: 1.3 // }, // callback: function (attr, styleOpt){ // var val= {attr}.attr // return {setHeight: -val.井深} // } // }, // popup: '编号:{编号}<br />名称:{附属物名称}<br />所属道路:{所属道路}', // }) // window.map.addLayer(rain_point_layer1) }, // 初始化放这里 async initmars3d() { var mapOptions = { scene: { // 默认视角参数 center: { lat: 35.9, lng: 120.2384, alt: 10000, heading: 360, pitch: -45 }, // 以下是Cesium.Globe对象相关参数 globe: { depthTestAgainstTerrain: true, // 是否启用深度监测 // baseColor: '#00192f', // 地球默认背景色 showGroundAtmosphere: false, // 是否在地球上绘制的地面大气 enableLighting: false // 是否显示昼夜区域 }, // 以下是Cesium.ScreenSpaceCameraController对象相关参数 cameraController: { zoomFactor: 3.0, // 鼠标滚轮放大的步长参数 minimumZoomDistance: 1, // 地球放大的最小值(以米为单位) maximumZoomDistance: 50000000, // 地球缩小的最大值(以米为单位) enableRotate: true, // 2D和3D视图下,是否允许用户旋转相机 enableTranslate: true, // 2D和哥伦布视图下,是否允许用户平移地图 enableTilt: true, // 3D和哥伦布视图下,是否允许用户倾斜相机 enableZoom: true, // 是否允许 用户放大和缩小视图 enableCollisionDetection: true // 是否允许 地形相机的碰撞检测 } }, basemaps: [ { pid: 10, id: 2011, name: "天地图", type: "group", layers: [ { name: "注记", type: "tdt", layer: "ter_z", key: ["9ae78c51a0a28f06444d541148496e36"] }, { name: "注记", type: "tdt", layer: "img_z", key: ["9ae78c51a0a28f06444d541148496e36"] }, ] }, { "id": 2021, "pid": 10, "name": "天地图影像", "icon": "http://mars3d.cn/example/img/basemaps/tdt_img.png", "type": "tdt", "layer": "img_d", "key": ["9ae78c51a0a28f06444d541148496e36"], "show": true }, { "id": 2020, "pid": 10, "name": "天地图电子", "icon": "http://mars3d.cn/example/img/basemaps/tdt_vec.png", "type": "group", "layers": [ { "name": "底图", "type": "tdt", "layer": "vec_d", "key": ["9ae78c51a0a28f06444d541148496e36"] }, { "name": "注记", "type": "tdt", "layer": "vec_z", "key": ["9ae78c51a0a28f06444d541148496e36"] } ] }, ], } // 创建三维地球场景 let map = new mars3d.Map('mars3dContainer', mapOptions) map.basemap = 2021 map.scene.screenSpaceCameraController.enableCollisionDetection = false // 设置鼠标 map.scene.screenSpaceCameraController.tiltEventTypes = [ Cesium.CameraEventType.RIGHT_DRAG ] // 缩放设置 重新设置缩放成员 map.scene.screenSpaceCameraController.zoomEventTypes = [Cesium.CameraEventType.MIDDLE_DRAG, Cesium.CameraEventType.WHEEL, Cesium.CameraEventType.PINCH] // 鼠标左键平移 map.scene.screenSpaceCameraController.rotateEventTypes = [Cesium.CameraEventType.LEFT_DRAG] window.map = map underground = new mars3d.thing.Underground({ alpha: 0.4, }) map.addThing(underground) window.map.basemap.opacity = 0.4 let that = this this.handler.setInputAction(function(movement) { if(window.map.level<19){ // ysline.show = true wsline.show = true }else{ if(that.alpha<90){ // ysline.show = false wsline.show = false } } }, Cesium.ScreenSpaceEventType.WHEEL) // lat: 35.9, lng: 120.2384, let graphicLayer = new mars3d.layer.GraphicLayer() map.addLayer(graphicLayer) let primitive = new mars3d.graphic.ModelPrimitive({ position: [120.242, 35.98342, 0], style: { url: '../static/model/m1/m1.gltf', scale: 100, heading: 19.9 } }) graphicLayer.addGraphic(primitive) // tile_layer = new mars3d.layer.ArcGisLayer({ // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer', // layers: '0,3', // show:false, // // maximumTerrainLevel: 19, // enablePickFeatures: false, // }) // map.addLayer(tile_layer) // let wfsLayer = new mars3d.layer.ArcGisWfsLayer({ // name: '雨水管线', // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/4', // minimumLevel: 19, // symbol: { // type: 'polylineVolumeP', // styleOptions: { // color: '#375cad', // shape: 'pipeline', // radius: 0.1 // }, // callback: function (attr, styleOpt){ // var val= {attr}.attr // return {setHeight: [-val.起始埋深,-val.终止埋深]} // } // }, // popup: '名称:雨水管线<br />编号:{编号}<br />材质:{材质}<br />管径:{管径}<br />所属道路:{所属道路}', // }) // map.addLayer(wfsLayer) let wfsLayer = new mars3d.layer.ArcGisWfsLayer({ name: '管线',//'污水管线', url: 'http://223.82.47.232:11408/arcgis/rest/services/qd/MapServer/0', minimumLevel: 19, symbol: { type: 'polylineVolumeP', styleOptions: { color: '#eb6b0c', shape: 'pipeline', radius: 0.1 }, callback: function (attr, styleOpt){ var val= {attr}.attr return {setHeight: [-val.起始埋深,-val.终止埋深]} } }, popup: '名称:给水管线<br />编号:{编号}<br />材质:{材质}<br />管径:{管径}<br />所属道路:{所属道路}', }) map.addLayer(wfsLayer) // ysline = new mars3d.layer.ArcGisWfsLayer({ // name: '雨水线', // url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/4', // // maximumLevel: 19, // enablePickFeatures: false, // symbol: { // type: 'polylineP', // styleOptions: { // color: '#375cad', // // radius: 0.1 // }, // }, // // }) // map.addLayer(ysline) wsline = new mars3d.layer.ArcGisWfsLayer({ name: '管线', url: 'http://223.82.47.232:11408/arcgis/rest/services/qd/MapServer/0', // maximumLevel: 19, enablePickFeatures: false, symbol: { type: 'polylineP', styleOptions: { color: '#eb6b0c', // radius: 0.1 }, }, }) map.addLayer(wsline) this.initpoints("1=1") this.refreshAlarm() }, // 获取井类型,显示井类型下拉 fetchWellType() { getWellType().then(response => { this.wellTypeList = [] // 如果该用户支持的井类型只有一个,则不显示该筛选框 // const wellTypes = this.$store.getters.wellTypes for (const wellType of response.data) { // if (wellTypes.indexOf(wellType.value) !== -1) { this.wellTypeList.push(wellType) // } } if (this.wellTypeList.length <= 1) { this.showWellType = false } }) }, flytoinit(){ var center = { lat: 35.9, lng: 120.2384, alt: 10000, heading: 360, pitch: -45 } window.map.setCameraView(center) }, // 获取全部井列表 getWellList() { if(this.listQuery.keywords=== ''){ this.initpoints("1=1") return } getWellList(this.listQuery).then(response => { if (response.code === 200) { // todo let str = "1 <> 1" for (const res of response.data) { str += (" or 编号 = '" + res.wellCode + "'") } this.initpoints(str) } }) }, // 点击井详情气泡 openInfoWindow(wellId) { this.currentWindow.visible = false getWellInfo(wellId).then(response => { if (response.code === 200) { const wellInfo = response.data this.wellInfo = { wellCode: wellInfo.wellCode, position: wellInfo.position, wellTypeName: wellInfo.wellTypeName, deptName: wellInfo.deptName, bfztName: wellInfo.bfztName, deep: wellInfo.deep } this.currentWindow.position = [wellInfo.lngGaode, wellInfo.latGaode] this.currentWindow.visible = true this.currentWindow.windowType = 'info' this.trackPopUp = true } }) }, // 刷新报警列表 refreshAlarm() { this.count = 60 this.loading = true getAlarmsNow().then(response => { if (response.code === 200) { this.loading = false // 获取当前报警列表 this.alarmList = response.data if (this.alarmList.length > 0) { this.hasAlarm = true } let str = "1 <> 1" var map = {}; for (const alarm of response.data) { str += (" or 编号 = '" + alarm.wellCode + "'") map[alarm.wellCode] = alarm } if(alarm_layer!==null){ window.map.removeLayer(alarm_layer) } alarm_layer = new mars3d.layer.ArcGisWfsLayer({ name: '报警点', url: 'http://223.82.47.232:11408/arcgis/rest/services/sfw/MapServer/1', where: str, // minimumLevel: 15, symbol: { type: 'modelP', styleOptions: { url: '../static/model/baojing.gltf', minimumPixelSize: 20, maximumScale: 15, scale: 1 }, // callback: function (attr, styleOpt){ // var val= {attr}.attr // return {setHeight: val.井深} // } }, popup: function(e){ var val = e.graphic.options.attr return `井编号:${val.编号}<br />井名称:${val.附属物名称}<br />所属道路:${val.所属道路}<br />告警原因:${map[val.编号].alarmContent}<br />告警时间:${map[val.编号].alarmTime}` } }) window.map.addLayer(alarm_layer) } }) }, // 点击报警详情 openAlarmWindow(wellId, position) { // 旧弹窗不显示 this.currentWindow.visible = false // this.filterIcon() getWellAlarms(wellId).then(response => { console.log(response) if (response.code === 200) { const wellInfo = response.data this.alarmInfo = { wellCode: wellInfo.wellCode, position: wellInfo.position, deptName: wellInfo.deptName, wellTypeName: wellInfo.wellTypeName, alarms: wellInfo.alarmList, deep: wellInfo.deep } this.currentWindow.position = position this.center = position this.currentWindow.visible = true this.currentWindow.windowType = 'alarm' this.trackPopUp = true } }) }, // 点击报警列表 alarmRowClick(row, column, event) { if(this.alpha<10){ this.alpha = 15 } this.flytoinit() if(fly_layer!==null) window.map.removeLayer(fly_layer) const wellId = row.wellCode let str = "编号 = '" + wellId + "'" fly_layer = null fly_layer = new mars3d.layer.ArcGisWfsLayer({ name: '报警点', url: 'http://223.82.47.232:11408/arcgis/rest/services/sfw/MapServer/1', where: str, symbol: { type: 'modelP', styleOptions: { url: '../static/model/baojing.gltf', scale: 0 }, callback: function (attr, styleOpt){ var val= {attr}.attr var center = {lat: val.wd, lng: val.jd, alt: 50, heading: 360, pitch: -90} window.map.setCameraView(center) } } }) window.map.addLayer(fly_layer) } } } </script> <style rel="stylesheet/scss" lang="scss" scoped> /deep/ .mars3d-popup-content { margin: 20px; line-height: 1.9; font-size: 18px; } @CHARSET "UTF-8"; // 查询框 .map-search-div{ position: absolute; z-index: 100; padding: 0px 10px; background-color: rgba(244, 244, 244, 0.9); /*left: 90px;*/ .el-form-item{ margin-bottom: 0px; } } // 刷新框 .function-div{ position: absolute; right: 10px; top: 7px; z-index: 1100; padding: 10px; color: #ce8b74; font-size: 14px; /*background-color: rgba(244, 233, 230, 1.0);*/ .font-red{ color: red; font-weight: bold; } .el-icon-refresh:hover{ color: red; font-weight: bold; cursor: pointer; } } // 报警列表 .map-alarm-div{ position: absolute; z-index: 100; background-color: rgba(255, 234, 241,0.8); top: 40px; left: 0px; .map-alarm-div-header{ line-height: 35px; width: 621px; padding-left: 10px; .icon-right{ position: absolute; right: 15px; } .icon-right:hover{ color: #409EFF; cursor: pointer; } } .el-scrollbar { /*height: 200px;*/ width: 100%; } .moredatascollor{ height: 200px; } .el-scrollbar__wrap { overflow-y: auto; overflow-x: hidden; padding:0px !important; margin-bottom: 0px !important; } .el-table th{ /*background-color: rgba(255, 229, 230, 0.8);*/ padding: 7px 0px; } .el-table td{ /*background-color: rgba(255, 234, 241, 0.8);*/ padding: 5px 0px; /*line-height: 1;*/ } .el-table td:hover{ /*background-color: rgba(255, 234, 241, 0.8);*/ } .transition-box { margin-bottom: 10px; width: 200px; height: 100px; border-radius: 4px; background-color: #409EFF; text-align: center; color: #fff; padding: 40px 20px; box-sizing: border-box; margin-right: 20px; } } // 刷新框 .refresh-div{ position: absolute; right: 10px; top: 7px; z-index: 100; padding: 10px; color: #ce8b74; font-size: 14px; background-color: rgba(244, 233, 230, 1.0); .font-red{ color: red; font-weight: bold; } .el-icon-refresh:hover{ color: red; font-weight: bold; cursor: pointer; } } // 地图 .el-divider--horizontal{ margin: 5px 0; } /*按钮样式*/ .add-button{ } </style> <style rel="stylesheet/scss" lang="scss"> .map-alarm-div { .el-scrollbar__wrap { overflow-y: auto; overflow-x: hidden; padding: 0px !important; margin-bottom: 0px !important; } } .cover{ position: absolute; bottom: 3px; left: 0px; /*background-color: red;*/ background-color: #2d3b43; width: 100px; height: 25px; } </style>