You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

612 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<div class="mapwrap" :title="title" :is-show.sync="isShow" :width="width" @resetform="resetPointArr">
<div class="mapbtn">
<el-card shadow="hover">
<div style="width: 500px;">
<el-row>
<el-col :span="11">
<el-input class="vm10" style="width: 93%" v-model="searchFields.keyword" placeholder="关键字搜索" />
</el-col>
<block v-if="moreSearch">
<el-col :span="11">
<el-select class="vm10" filterable v-model="searchFields.area_id" placeholder="请选择所属片区">
<el-option v-for="item in selects.areasList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11" >
<el-select class="vm10" filterable v-model="searchFields.maintain_id" placeholder="请选择所属养护单位">
<el-option v-for="item in selects.maintainList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11">
<el-select class="vm10" filterable v-model="searchFields.status" placeholder="请选择状态">
<el-option v-for="item in selects.statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11" >
<el-select class="vm10" filterable v-model="searchFields.unusual_type_id" placeholder="请选择异常类型">
<el-option v-for="item in selects.sunusualList" :key="item.id" :label="item.value" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11">
<el-select class="vm10" filterable v-model="searchFields.type" placeholder="请选择类型">
<el-option v-for="item in selects.typeList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11" >
<el-select class="vm10" filterable v-model="searchFields.end_type" placeholder="请选择结办类型">
<el-option v-for="item in selects.endTypeList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="11">
<el-select class="vm10" filterable v-model="searchFields.ask_content_id" placeholder="请选择巡查内容">
<el-option v-for="item in selects.sequiementList" :key="item.id" :label="item.value"
:value="item.id">
</el-option>
</el-select>
</el-col>
</block>
<el-col :span="11" >
<el-select class="vm10" v-model="searchFields.road_id" filterable remote reserve-keyword clearable
@focus="remoteRoad" placeholder="请输入关键词查找道路" :remote-method="remoteMethod" :loading="roadloading">
<el-option v-for="item in roadsList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="24">
<el-date-picker class="vm10" v-model="mapdatesearch" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd">
</el-date-picker>
<el-button type="text" style="margin-left: 10px;" @click="moreSearch=true" v-if="!moreSearch">更多</el-button>
<el-button type="text" style="margin-left: 10px;" @click="moreSearch=false" v-if="moreSearch">隐藏</el-button>
</el-col>
<el-col :span="24">
<Button type="primary" @click="loadMap(false)" style="margin-left: 10px">查询</Button>
<Button type="primary" @click="resetSearch" style="margin-left: 10px">重置</Button>
</el-col>
</el-row>
</div>
</el-card>
</div>
<div>
<div class="wrapper" v-if="showmap">
<div class="chooseMap">
<div>
<el-radio-group v-model="showMap" @change="changeMap">
<el-radio v-for="item in mapRadioList" :label="item.id">{{item.title}}</el-radio>
</el-radio-group>
</div>
<div>
<el-checkbox-group v-model="checkList" @change="changeCheck">
<el-checkbox v-for="item in mapCheckList" :label="item.id">{{item.title}}</el-checkbox>
</el-checkbox-group>
</div>
</div>
<!-- 地图 -->
<div class="map" id="olMap"></div>
<!-- 弹框 -->
<div ref="popup" class="popup" v-show="shopPopup">
<div class="info">
<div class="address">地址:{{nowAddress}}</div>
<div class="showinfo" @click='showInfo(nowId,types)'>查看详情</div>
</div>
</div>
</div>
</div>
</div>
<showRainEquipmentInfo ref="showRainEquipmentInfo"></showRainEquipmentInfo>
<showRainSiteInfo ref="showRainSiteInfo"></showRainSiteInfo>
</div>
</template>
<script>
import "ol/ol.css";
import {
Tile as TileLayer,
Vector as VectorLayer
} from "ol/layer";
import XYZ from "ol/source/XYZ";
import {
TileArcGISRest
} from "ol/source"
import tilegrid from "ol/tilegrid/TileGrid"
import {
defaults as defaultControls
} from "ol/control";
import {
get as getprojection
} from "ol/proj"
import {
Projection,
addProjection
} from "ol/proj"
import Map from "ol/Map.js";
import View from "ol/View.js";
// 标注点位
import {
Vector as VectorSource
} from "ol/source";
import * as olProj from "ol/proj";
import {
Feature,
Overlay
} from "ol"
import {
Point
} from "ol/geom";
import {
Style,
Fill,
Stroke,
Circle as sCircle
} from "ol/style";
import proj4 from 'proj4'
import {
CONFIGS,
MAPCONFIGS
} from '@/views/rain/inspection/components/config'
import {
listroad
} from '../../../../api/basic/road.js'
import showRainEquipmentInfo from '@/views/rain/inspection/components/showRainEquipmentInfo'
import showRainSiteInfo from '@/views/rain/inspection/components/showRainSiteInfo'
export default {
components: {
showRainEquipmentInfo,
showRainSiteInfo,
CONFIGS,
MAPCONFIGS
},
data() {
return {
moreSearch: false,
showSearch: true,
title: "巡查点位",
showmap: false,
width: "100%",
isShow: false,
map: null,
shopPopup: false,
nowAddress: "",
nowId: "",
types: "",
showMap: "M2",
mapRadioList: [{
id: "M2",
title: "天地图"
}, {
id: "S1",
title: "水利图"
}, {
id: "H1",
title: "河道图"
}],
checkList: ['M11', 'L1'],
mapCheckList: [{
id: "M11",
title: "高清影像精简"
},{
id: "L1",
title: "路网"
},{
id: "M1",
title: "高清影像"
}],
configs: CONFIGS,
mapConfigs: MAPCONFIGS,
projection: "EPSG:4490",
featuresArr: [],
flagLayer: "",
pointArr: [],
searchFields: {
is_export: 0,
is_auth: 1
},
roadsList: [],
roaddisabled: false,
roadloading: false,
mapdatesearch: "",
selects: {
},
};
},
created() {},
mounted() {
// 转换坐标系
proj4.defs("EPSG:4490", '+proj=longlat +ellps=GRS80 +no_defs')
this.projection = new Projection({
code: this.mapConfigs.Map_Code,
units: this.mapConfigs.Map_units,
axisOrientation: this.mapConfigs.Map_axisOrientation,
global: this.mapConfigs.Map_global
});
addProjection(this.projection);
// this.initMap();
},
watch: {
pointArr(newval, oldval) {
if (newval) {
// this.resetPointArr()
this.pointArr = newval
this.showmap = false
this.$nextTick(function() {
this.showmap = true
this.showMap = 'M2'
this.checkList = ['M11', 'L1']
this.showMaps()
})
}
},
mapdatesearch(newVal, oldVal) {
if (newVal) {
this.searchFields.start_date = newVal[0]
this.searchFields.end_date = newVal[1]
} else {
this.searchFields.start_date = ""
this.searchFields.end_date = ""
}
}
},
methods: {
showMaps() {
this.$nextTick(function() {
this.initMap();
})
},
initMap() {
let map = new Map({
target: "olMap",
view: new View({
center: this.mapConfigs.MAP_center, //中心点经纬度
zoom: this.mapConfigs.Map_Zooms[0], //图层缩放大小
maxZoom: this.mapConfigs.Map_Zooms[1],
minZoom: this.mapConfigs.Map_Zooms[2],
projection: this.projection,
}),
layers: [],
// interactions: defaultControls({
// doubleClickZoom: false,
// }),
});
this.map = map;
// 添加天地图
let url = "http://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}";
url = `${url}&T=vec_c&tk=82526d64e8504a0341f775c087863825`;
let tdtLayer = new TileLayer({
title: "天地图",
id: "M2",
type: "overlay",
visible: true,
layerType: "TD地图",
opacity: 1,
source: new XYZ({
crossOrigin: 'anonymous',
url: url,
projection: "EPSG:4326"
})
});
this.map.addLayer(tdtLayer);
this.ShowLayers()
this.setMarker()
this.addOverlay()
this.singleclick()
// this.map.layer2.setVisible(false)
},
//加载图层
ShowLayers() {
for (var i = 0; i < this.configs.length; i++) {
var result = this.configs[i];
if (result.layerType == "GIS地图") {
let projection = getprojection(result.projection);
let origin = [-400.0, 399.9999999999998];
let resolutions = [0.0027465820824835565, 0.0013732910412417782, 6.866455206208891E-4,
3.4332276031044456E-4, 1.7166138015522228E-4, 8.583069007761114E-5, 4.291534503880557E-5,
2.1457672519402785E-5, 1.0728836259701392E-5
];
let fullExtent = [118.63622216442072, 30.12564516975147, 122.81217622965288, 32.74305227616479];
let tileGrid = new tilegrid({
tileSize: 256,
origin: origin,
extent: fullExtent,
resolutions: resolutions
});
let layer = new TileLayer({
title: result.title,
id: result.id,
type: result.type,
visible: result.visible,
layerType: result.layerType,
opacity: result.opacity,
source: new XYZ({
tileGrid: tileGrid,
url: result.url,
projection: projection
})
})
this.map.addLayer(layer);
} else {
let layer = new TileLayer({
title: result.title,
id: result.id,
type: result.type,
visible: result.visible,
layerType: result.layerType,
opacity: result.opacity,
source: new TileArcGISRest({
url: result.url,
projection: result.projection
}),
});
this.map.addLayer(layer);
}
}
},
// 设置巡查 点位
setMarker() {
// 设置图层
this.flagLayer = new VectorLayer({
source: new VectorSource()
});
// 添加图层
this.map.addLayer(this.flagLayer);
// 循环添加feature
for (let i = 0; i < this.pointArr.length; i++) {
// 创建feature一个feature就是一个点坐标信息
let feature = new Feature({
geometry: new Point([this.pointArr[i][0], this.pointArr[i][1]])
});
// 设置展示 地址
feature.set('address', this.pointArr[i][2])
feature.set('types', this.pointArr[i][4])
// 设置 巡查ID
feature.setId(this.pointArr[i][3])
feature.setStyle(
new Style({
image: new sCircle({
fill: new Fill({
color: '#0f9b0f',
}),
radius: 6,
}),
})
);
this.featuresArr.push(feature);
} // for 结束
this.flagLayer.getSource().addFeatures(this.featuresArr);
},
addOverlay() {
// 创建Overlay
let elPopup = this.$refs.popup;
this.popup = new Overlay({
element: elPopup,
positioning: "bottom-center",
stopEvent: false,
offset: [0, -20],
});
this.map.addOverlay(this.popup);
},
singleclick() {
// 点击
this.map.on("singleclick", (e) => {
// 判断是否点击在点上
let feature = this.map.forEachFeatureAtPixel(
e.pixel,
(feature) => feature
);
if (feature) {
this.shopPopup = true;
// 设置弹窗位置
let coordinates = feature.getGeometry().getCoordinates();
this.nowAddress = feature.get('address');
this.nowId = feature.getId()
this.types = feature.get('types');
this.popup.setPosition(coordinates);
} else {
this.shopPopup = false;
}
});
},
showInfo(id, type) {
// 日常雨水设施
if (type == 1) {
this.$refs.showRainEquipmentInfo.isShow = true
this.$refs.showRainEquipmentInfo.getEquipmentInfo(id)
this.$refs.showRainEquipmentInfo.infoId = id
this.$refs.showRainEquipmentInfo.formType = 'showform'
}
// 工地
if (type == 2) {
this.$refs.showRainSiteInfo.isShow = true
this.$refs.showRainSiteInfo.getSiteInfo(id)
this.$refs.showRainSiteInfo.infoId = id
this.$refs.showRainSiteInfo.formType = 'showform'
}
},
changeMap(val) {
for (var m of this.mapRadioList) {
if (m.id == val) {
this.checkLayers(val, true)
} else {
this.checkLayers(m.id, false)
}
}
},
changeCheck(val) {
if (val.length == 0) {
for (var m of this.mapCheckList) {
this.checkLayers(m.id, false)
}
} else {
for (var m of this.mapCheckList) {
this.checkLayers(m.id, false)
}
for(var k of val){
this.checkLayers(k, true)
}
}
},
// 切换地图
checkLayers(id, bool) {
let layers = this.map.getLayers().getArray();
for (let i = 0; i < layers.length; i++) {
if (layers[i].get("id") == id) {
if (bool) {
layers[i].setVisible(true);
} else {
layers[i].setVisible(false);
}
}
}
},
loadMap() {
this.$emit('loadMap', this.searchFields)
},
resetPointArr() {
this.map = null
let _that = this;
this.flagLayer
.getSource()
.getFeatures()
.forEach(function(feature) {
_that.flagLayer.getSource().removeFeature(feature);
});
this.featuresArr = [];
this.flagLayer.getSource().clear();
},
resetSearch() {
this.searchFields = {}
this.mapdatesearch = ['', '']
},
remoteRoad() {
this.roadsList = []
},
remoteMethod(query) {
if (query != '') {
this.roadloading = true
listroad({
name: query
}).then(res => {
this.roadloading = false
this.roadsList = res.data
})
} else {
this.roadsList = []
}
}
},
};
</script>
<style lang="scss" scoped>
.mapwrap {
position: relative;
.mapbtn {
position: absolute;
top: 10px;
left: 50px;
z-index: 999;
}
}
.vm10 {
margin-bottom: 10px
}
.chooseMap {
position: absolute;
margin: 15px 20px;
// width: 350px;
background-color: #fff;
border-radius: 4px;
border: 0.8px solid hsla(0, 0%, 60%, .2);
z-index: 99;
top: 0;
right: 0;
line-height: 40px;
// text-align: center;
padding: 0 40px 0 20px;
}
.map {
width: 100vw;
height: 100vh;
}
.popup {
width: 200px;
background-color: white;
padding: 18px;
border-radius: 10px;
box-shadow: 0 0 15px rgb(177, 177, 177);
.info {
font-size: 14px;
text-align: left;
ul {
padding-left: 0;
}
.showinfo {
color: red;
cursor: pointer;
}
}
}
.common-dialog {
margin: 0 !important;
.el-dialog__header {
padding-top: 0;
button {
height: 28px;
padding: 0 20px;
line-height: 28px;
margin-left: 10px;
}
}
}
</style>