<!--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>
</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 = []
export default {
name: 'Overview',
components: { DeptSelect, SelectTree },
data() {
return {
map: null,
ysline: null,
wsline: null,
underground: null,
img_layer: null,
tile_layer: null,
tiles3dLayer: null,
rain_point_layer: null,
rain_point_layer1: null,
sewage_point_layer: null,
alarm_layer: null,
fly_layer: null,
type: 'massMarkers', // 加载数据方式:massMarkers或cluster
refreshType: 'websocket', // 刷新数据方式:clock或websocket
showAlarm: true, // 是否显示报警
showAll: false, // 是否显示全部井
alpha: 100, // 是否显示全部井
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){
this.img_layer.alpha = val/100
// this.ysline.alpha = val/100
// this.wsline.alpha = val/100
this.map.basemap.opacity = val/100
this.tiles3dLayer.opacity = val/100
this. underground.alpha = val/100
console.log(val,this.map.level)
if(val<=90 && this.map.level>=19){
// this.map.scene.globe.show = false
this.ysline.show = false
this.wsline.show = false
}else {
// this.map.scene.globe.show = true
this.ysline.show = true
this.wsline.show = true
}
},
showAll(val) {
this.tile_layer.show = val
},
// needRefresh(val) {
// // 需要刷新
// if (val) {
// this.refreshAlarm()
// }
// },
showAlarm(val){
if(!val && this.currentWindow.windowType=='alarm'){
this.currentWindow.visible = false
}
this.alarm_layer.show = val
}
},
created() {
this.fetchWellType()
},
computed: {
handler() {
return new Cesium.ScreenSpaceEventHandler(this.map.scene.canvas)
}
},
methods: {
changetype(){
if(this.listQuery.wellType==='1'){ // 雨水
this.rain_point_layer.show = true
this.rain_point_layer1.show = true
this.sewage_point_layer.show = false
}else if(this.listQuery.wellType==='2'){ //污水
this.rain_point_layer.show = false
this.rain_point_layer1.show = false
this.sewage_point_layer.show = true
}else{
this.rain_point_layer.show = true
this.rain_point_layer1.show = true
this.sewage_point_layer.show = true
}
},
async initpoints(str) {
if(this.sewage_point_layer!==null) this.map.removeLayer(this.sewage_point_layer)
if(this.rain_point_layer!==null) this.map.removeLayer(this.rain_point_layer)
if(this.rain_point_layer1!==null) this.map.removeLayer(this.rain_point_layer1)
this.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 />所属道路:{所属道路}',
})
this.map.addLayer(this.sewage_point_layer)
this.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 />所属道路:{所属道路}',
})
this.map.addLayer(this.rain_point_layer)
this.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 />所属道路:{所属道路}',
})
this.map.addLayer(this.rain_point_layer1)
},
// 初始化放这里
async initmars3d() {
var mapOptions = {
scene: {
// 默认视角参数
center: { lat: 27.68, lng: 116.0935, 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"] }
// ]
// },
],
}
// 创建三维地球场景
var map = new mars3d.Map('mars3dContainer', mapOptions)
map.basemap = 2011
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]
this.map = map
this.underground = new mars3d.thing.Underground({
alpha: 1,
})
map.addThing(this.underground)
this.tiles3dLayer = new mars3d.layer.TilesetLayer({
name: '倾斜摄影',
url: 'http://111.198.10.15:20603/CRGroup03/tileset.json',
show:true,
type: '3dtiles',
maximumScreenSpaceError: 8,
maximumMemoryUsage: 1024,
// center: {lat: 27.750462, lng: 116.090196, alt: 130, heading: 3, pitch: 7 },
position: {
lng: 116.069103, lat: 27.756591, alt: -70
},
skipLevelOfDetail: true,
loadSiblings: true,
cullRequestsWhileMoving: true,
cullRequestsWhileMovingMultiplier: 10,
preferLeaves: true,
dynamicScreenSpaceError: true,
preloadWhenHidden: true,
flyTo: true
})
let that = this
this.handler.setInputAction(function(movement) {
console.log(movement,that.map.level)//向上滑是100 向下滑是-100
if(that.map.level<19){
that.ysline.show = true
that.wsline.show = true
}else{
if(that.alpha<90){
that.ysline.show = false
that.wsline.show = false
}
}
}, Cesium.ScreenSpaceEventType.WHEEL)
map.addLayer(this.tiles3dLayer)
this.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(this.tile_layer)
this.img_layer = new mars3d.layer.XyzLayer({
url: 'http://223.82.47.232:11502/crtiles01/{z}/{x}/{y}.png',
crs: 'EPSG:3857',
queryParameters: {
//可以传自定义url参数,如token等
token: 'mars3d',
}
})
map.addLayer(this.img_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)
wfsLayer = new mars3d.layer.ArcGisWfsLayer({
name: '污水管线',
url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/5',
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)
this.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(this.ysline)
this.wsline = new mars3d.layer.ArcGisWfsLayer({
name: '污水线',
url: 'http://223.82.47.232:11408/arcgis/rest/services/crgx/MapServer/5',
// maximumLevel: 19,
enablePickFeatures: false,
symbol: {
type: 'polylineP',
styleOptions: {
color: '#eb6b0c',
// radius: 0.1
},
},
})
map.addLayer(this.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: 27.68, lng: 116.0935, alt: 10000, heading: 360, pitch: -45 }
this.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(this.alarm_layer!==null){
this.map.removeLayer(this.alarm_layer)
}
this.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}`
}
})
this.map.addLayer(this.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()
var that = this
if(this.fly_layer!==null) this.map.removeLayer(this.fly_layer)
const wellId = row.wellCode
let str = "编号 = '" + wellId + "'"
this.fly_layer = null
this.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}
that.map.setCameraView(center)
}
}
})
this.map.addLayer(this.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;
}
}
</style>