| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- <!--地图主组件-->
- <template>
- <div id="mapContent" style="height:100%;">
- <!-- 地图容器 -->
- <div id="mapNode" style="width:100%;height:100%;"></div>
- <!-- 名称弹窗 -->
- <div id="popup" class="ol-popup" style="display:none;">
- <div id="popup-content"></div>
- </div>
- <!-- 鼠标右键菜单 -->
- <div id="rightMenuContainer" class="rightMenuClass">
- <p style="border-bottom: 1px solid #bbb;" @click="rightMenuClick('start')">从这里出发</p>
- <p style="padding-top: 5px;" @click="rightMenuClick('end')">到这里去</p>
- </div>
- <!-- 标记弹窗 -->
- <div id="popupbj" class="ol-popup" style="display:none;">
- <!-- <a href="#" id="popup-closerbj" class="ol-popup-closer"></a> -->
- <div id="popup-contentbj">
- <!-- 弹窗内容 -->
- </div>
- </div>
- <!-- 地图小工具 -->
- <mapToolBar
- ref="mapToolBarRef"
- :view=viewObject
- :map=mapObject
- :fullExtent="fullExtent"
- @clickAd="clickAd"
- @hide=hidehandlerTool
- @eventHandler="mapToolBarHandler">
- </mapToolBar>
- <!-- 图层树 -->
- <layerTree ref="layerTreeRef" @hide=hidehandlerTree @leftLayerMenuClick="layerChange"></layerTree>
- <!-- 底图切换 -->
- <div id="baseMapContainer" style="position: absolute;right: 10px;top: 106px;width: 89px;display: flex;align-items: center;font-size:14px;">
- <img src="./assets/basemap.png">
- <el-select v-model="radio4" placeholder="请选择" @visible-change="closePanel" @change="baseMapChange">
- <el-option
- v-for="item in mapOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value">
- </el-option>
- </el-select>
- </div>
- <!-- 标记列表 -->
- <myBiaoJi
- ref="myBiaoJiRef"
- v-if="showBiaojiTable"
- @emitBiaoJiTableData="emitBiaoJiTableData"
- @showBiaoJi="tableRowClick"
- @closeDraggable="closeDraggable">
- </myBiaoJi>
- <!-- 一张图查询处理及结果列表展示 -->
- <searchOneMapResult
- v-if="showSearchOneMap"
- :viewObj = viewObject
- :mapObj = mapObject
- :mapPointObj = mapPointObj
- :layerList = leftLayersAddedList
- :bufferDistance = bufferDistance1
- @emit_searchOneMapTimeData="emit_searchOneMapTimeData"
- @closeDraggable="closeDraggable">
- </searchOneMapResult>
- <!-- 水利一张图 查询实时数据 -->
- <oneMapRealTimeData ref="oneMapRealTimeDataRef"
- v-show="showRealTimeData"
- @closeDraggable="closeDraggable">
- </oneMapRealTimeData>
- </div>
- </template>
- <script>
- import "ol/ol.css";
- import {dateFormat} from "../../utils/gw_date.js"
- //config
- import {baseLayerOptions_ol,mapExtent} from './config/lyrConfig.js'
- //init
- import {getPersonList} from './js/getPersonList.js'
- import {getProjectList} from './js/getProjectList.js'
- import {addBaseLayer} from './js/addBaseLayer.js'
- import {getPerTrack} from './js/getPerTrack.js'//获取人员轨迹
- import {perGzqkOnMap} from './js/perGzqkOnMap.js'//地图上展示人员轨迹 点
- //handler
- import {baseMapChangeHandler} from './js/baseMapChange.js' //底图切换
- import {xzqChange} from './js/xzqChange.js' //切换行政区
- import {pointMoveHandler} from './js/pointMoveHandler.js'//鼠标移动事件
- import {locationHandler} from './js/locationHandler.js' //定位响应方法
- import {biaojiHandler,getBiaoJiList} from './js/biaojiHandler.js' //标记
- import {addOneMapLayer} from './js/addOneMap.js' //添加一张图图层
- import {refreshLayerData} from './js/refreshLayerData.js'//地图范围发生变化之后 如果图层处于显示状态 则刷新数据
- import {addInterest,editInterest} from '../../api/zhxxAPI.js'//添加兴趣点
- import {removeLayerById} from './js/removeLayerById.js'
- export default {
- props:['select_nd','select_pc','select_xmlx'],
- components: {
- layerTree:resolve => {require(['./components/layerTree.vue'],resolve)},
- mapToolBar:resolve => {require(['./mapTool/mapToolBar.vue'],resolve)},
- myBiaoJi:resolve => {require(['./components/myBiaoJiTable'],resolve)},
- searchOneMapResult:resolve => {require(['./components/searchOneMapResult.vue'],resolve)},
- oneMapRealTimeData:resolve => {require(['./components/oneMapRealTimeData.vue'],resolve)},
- },
- data() {
- return {
- loading:true,
- radio4:'影像',//底图切换radiobutton
- mapObject:null,
- viewObject:null,
- fullExtent:'',
- initOptions:null,//各图层option
- popupDelay:'',//延时弹出
- currentRsCode:'1111111',
- currentStatus:'',
- currentLocation:'',
- zoomnext:'',
- currentExtent:'',
- timeInterval_people:'',//定时刷新人员
- currentChangeGraphicLayerId:'',//当前graphic类型变化的图层id
- currentChangeGraphicId:'',
- tileInfo:'',//高德切片信息
- biaojiFlag:false,
- showBiaojiTable:false,
- currentAdCode:'',
- leftLayersAddedList:[],//左侧图层已经添加列表 为一张图查询做支撑
- showSearchOneMapToolTip:false,//一张图查询开关
- showSearchOneMap:false,//一张图空间查询结果
- mapPointObj:null,
- bufferDistance1:10,//缓冲距离
- showRealTimeData:false,//水利一张图实时数据查询列表
- currentZoom:0,//当前底图level
- mapOptions:[
- {
- value: '影像',
- label: '影像'
- }, {
- value: '谷歌',
- label: '谷歌'
- }, {
- value: '高德',
- label: '高德'
- }
- ],
- menu_overlay:null,
- longLat:[],
- };
- },
- computed: {
- userId: function () {
- return localStorage.getItem("userid") ?localStorage.getItem("userid") : "1098101939614724096";
- },
- },
- watch: {
- select_nd(n,o){
- this.select_nd = n;
- this.parentSearchEvent();
- },
- select_pc(n,o){
- this.select_pc = n;
- this.parentSearchEvent();
- },
- select_xmlx(n,o){
- this.select_xmlx = n;
- this.parentSearchEvent();
- },
- },
- //生命周期 - 创建完成(可以访问当前this实例)
- created() {
- },
- //生命周期 - 挂载完成(可以访问DOM元素)
- mounted() {
- this.initOptions = baseLayerOptions_ol;
- this.initMap();
- },
- beforeCreate() {}, //生命周期 - 创建之前
- beforeMount() {}, //生命周期 - 挂载之前
- beforeUpdate() {}, //生命周期 - 更新之前
- updated() {}, //生命周期 - 更新之后
- beforeDestroy() {}, //生命周期 - 销毁之前
- destroyed() {}, //生命周期 - 销毁完成
- activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
- methods: {
- parentSearchEvent(){
- getPersonList(this);
- getProjectList(this);
- },
- initMap(){//初始化地图
- var _self = this;
- var ol = _self.$ol;
- var layers = [];
- _self.initOptions.forEach((item)=>{//所有底图
- var lyr = new ol.layer.Tile({
- id:item.id,
- source: new ol.source.XYZ({
- crossOrigin: 'anonymous',
- url: item.urlTemplate
- }),
- name: item.name,
- visible:item.visible
- });
- layers.push(lyr)
- })
- _self.mapObject = new ol.Map({
- layers:layers,
- view:new ol.View({
- center:mapExtent.center,
- zoom:mapExtent.zoom
- }),
- target:'mapNode'
- });
- _self.mapObject.on('click',_self.mapClickHandle);//点击事件
- _self.mapObject.on('moveend',_self.mapMoveHandler);//地图移动事件
- _self.mapObject.on('pointermove',_self.pointMoveHandle);//地图移动事件
- _self.initRightMenu();
- getPersonList(_self);//初始化 人员列表
- getProjectList(_self);//初始化 项目列表
- },
- initRightMenu(){
- var _self = this;
- var ol = _self.$ol;
- _self.menu_overlay = new ol.Overlay({
- element: document.getElementById("rightMenuContainer"),
- positioning: 'center-center'
- });
- _self.mapObject.addOverlay(_self.menu_overlay);
- $(_self.mapObject.getViewport()).on("contextmenu", function(event){
- event.preventDefault();//屏蔽自带的右键事件
- var pixel = [event.offsetX,event.offsetY];
- var feature = _self.mapObject.getFeaturesAtPixel(pixel);
- _self.longLat = [];
- // var arr = _self.mapObject.getCoordinateFromPixel(pixel);
- // _self.longLat.push(arr[0].toFixed(6));
- // _self.longLat.push(arr[1].toFixed(6));
- if(feature){
- // var coordinate = _self.mapObject.getEventCoordinate(event);
- var coordinate = feature[0].getGeometry().getCoordinates();
- _self.longLat.push(coordinate[0].toFixed(6));
- _self.longLat.push(coordinate[1].toFixed(6));
- _self.menu_overlay.setPosition(coordinate);
- }
- });
- },
- //地图点击事件
- mapClickHandle(e){
- var _self = this;
- _self.closePanel();
- if(_self.menu_overlay){
- _self.menu_overlay.setPosition(undefined);
- }
- console.log('x='+e.coordinate[0])
- console.log('y='+e.coordinate[1])
- var features = _self.mapObject.getFeaturesAtPixel(e.pixel);
- if(features){
- var obj = features[0].getProperties();
- // 判断是否点击的是矢量服务
- if(obj.elementtype){
- _self.$emit('showVectorLayerDetail',obj);
- }else if(obj.layer){
- if(obj.layer.indexOf('LAKE_')>-1 || obj.layer.indexOf('RIVER_')>-1){
- _self.$emit('showVectorLayerDetail',obj);
- }
- }
- console.log(features[0].getProperties().layerId);
- // mapClickHandler(_self,features[0].getProperties(),e);
- var layerId = features[0].getProperties().layerId;
- if(layerId == 'personGraphicLayer1' || layerId == 'personGraphicLayer0'){
- layerId = 'personGraphicLayer';
- }else{
- layerId = 'projectGraphicLayer';
- }
- _self.$emit('clickMapHandler',layerId,features[0].getProperties());
- }
- if(_self.biaojiFlag){//如果处于标记状态
- biaojiHandler(_self,e.coordinate[0],e.coordinate[1]);
- _self.biaojiFlag = false;
- document.getElementById("mapNode").style.cursor = "default";
- }else if(_self.showSearchOneMapToolTip){
- _self.showSearchOneMapToolTip = false;
- _self.showSearchOneMap = true;
- _self.mapPointObj = [e.coordinate[0],e.coordinate[1]];
- }
- },
- // 地图移动之后触发
- mapMoveHandler(e){
- // console.log(e);
- refreshLayerData(this);
- },
- //鼠标移动事件
- pointMoveHandle(e){
- var _self =this;
- if (e.dragging) {
- return;
- }
- var overlay = _self.mapObject.getOverlayById('ls_pointerMoveOverlayId');
- if(overlay){
- if(document.getElementById('popup')){
- document.getElementById('popup').style.display = 'none'
- }
- }
- if(_self.menu_overlay.getPosition()){
- return;
- }
- var features = _self.mapObject.getFeaturesAtPixel(e.pixel);
- if(features){
- // console.log(features[0].getProperties());
- if(features[0].getProperties().layerId){
- pointMoveHandler(_self,features[0].getProperties(),e);
- }else{
- pointMoveHandler(_self,features[0].getProperties(),e);
- }
- }
- this.$refs['mapToolBarRef'].clearLayer();
- },
- // 底图切换处理方法
- baseMapChange(val){//底图切换
- baseMapChangeHandler(this.mapObject,val);
- },
- layerChange(item){//左侧图层控制
- //debugger
- var _self = this;
- if(item.id.substring(0,7) == 'oneMap_'){
- //添加一张图服务
- addOneMapLayer(this,this.mapObject,item,this.leftLayersAddedList);
- }else{
- if(item.checked){//是否选中的时候再去请求数据
- // layerHangeHandler(_self,item)
- }
- this.mapObject.getLayers().forEach((val)=>{
- if(item.id=='skGraphicLayer2019' || item.id=='fcskGraphicLayer' || item.id=='shgcGraphicLayer' ||
- item.id=='ydbGraphicLayer' || item.id=='szy_sydGraphicLayer' || item.id=='szy_qyshGraphicLayer' ||
- item.id=='personGraphicLayer' || item.id=='szy_jsglGraphicLayer' || item.id=='szy_ysdwGraphicLayer'){
- var arr = [0,1,2];
- arr.forEach((v)=>{
- if(val.getProperties().id == item.id+v){
- val.setVisible(item.checked);
- return;
- }
- })
- }else{
- if(val.getProperties().id == item.id){
- val.setVisible(item.checked);
- return;
- }
- }
- })
- this.$emit('isChecks1',item);
- }
- },
- clickAd(item){//右上角工具条 切换行政区
- this.currentAdCode = item.adCode;
- this.$emit('currentAdCodeChange',this.currentAdCode);
- xzqChange(this,this.mapObject,item,this.fullExtent);
- },
- mapToolBarHandler(item){
- if(item == 'biaoji'){//标记
- this.biaojiFlag = true;
- this.showBiaojiTable = true;
- }else if(item == "chaxun"){
- this.showSearchOneMapToolTip = !this.showSearchOneMapToolTip;
- if(!this.showSearchOneMapToolTip){
- this.closeDraggable('searchOneMap');
- document.getElementById("mapNode").style.cursor = "default";
- }else{
- document.getElementById("mapNode").style.cursor = "crosshair";
- }
- }else if(item == 'jietu'){
- this.mapObject.once('postcompose', function (event) {
- var filename = 'map.png';
- var canvas = event.context.canvas;
- if (navigator.msSaveBlob) {
- navigator.msSaveBlob(canvas.msToBlob(), filename);
- } else {
- canvas.toBlob(function (blob) {
- saveAs(blob, 'map.png');
- });
- }
- });
- this.mapObject.renderSync();
- }
- },
- //图例控制图层显隐
- lengendChangeHandler(item){
- var _self = this;
- _self.mapObject.getLayers().forEach((val)=>{
- if(val){
- if(val.getProperties().id == item.id){
- val.setVisible(!val.getVisible());
- }
- }
- })
- },
- //点击地图 关闭右上角所有打开面板
- closePanel(){
- this.$refs['mapToolBarRef'].hide();
- this.$refs['layerTreeRef'].hide();
- },
- hidehandlerTool(){
- this.$refs['layerTreeRef'].hide();
- },
- hidehandlerTree(){
- this.$refs['mapToolBarRef'].hide();
- },
- emitBiaoJiTableData(item){
- getBiaoJiList(this,item);
- },
- closeDraggable(item){
- document.getElementById("mapNode").style.cursor = "default";
- if(item == "myBj"){
- this.showBiaojiTable = false;
- this.biaojiFlag = false;
- removeLayerById(this,'ls_bjGraphicLayer');
- }else if(item == "searchOneMap"){
- this.showSearchOneMap = false;
- this.showSearchOneMapToolTip = false;
- }else if(item == "searchOneMapRealTimeData"){
- this.showRealTimeData = false;
- }
- },
- tableRowClick(item,type,obj,layerId){//列表交互
- if(type == "locate"){//定位
- locationHandler(this,item,obj,layerId);
- }else if(type == "track"){
- getPerTrack(this,item,obj);
- }
- },
- saveBjHandler(ptx,pty){//保存标记
- var _self = this;
- var nameContent = document.getElementById('nameId').value
- if(!nameContent){
- this.$message({
- message: '请输入名称',
- type: 'warning'
- });
- return;
- }
- var noteContent = document.getElementById('noteId').value
- var timeStr = dateFormat(new Date(),'yyyy-MM-dd HH:mm:ss')
- addInterest(noteContent,nameContent,timeStr,ptx,pty,this.userId).then((res)=>{
- if(res.success){
- _self.$message.success("添加成功");
- if(_self.$refs['myBiaoJiRef']){
- _self.$refs['myBiaoJiRef'].getMyBjList();
- }
- if(document.getElementById('popupbj')){
- document.getElementById('popupbj').style.display = 'none'
- }
- }
- });
- },
- // 查询实时数据
- emit_searchOneMapTimeData:function(tableHeader,tableData){
- this.showRealTimeData = true;
- this.$refs["oneMapRealTimeDataRef"].getTableData(tableHeader,tableData);
- },
- //在地图上展示人员工作情况 轨迹
- showPerGzqkOnMap(item){
- perGzqkOnMap(this,item);
- },
- clearLayer(){
- var _self = this;
- _self.mapObject.getLayers().forEach((val)=>{
- if(val){
- if(val.getProperties().id.substring(0,3) == 'ls_'){
- val.getSource().clear();
- _self.mapObject.removeLayer(val);
- }
- }
- });
- },
- rightMenuClick(val){
- let _self = this;
- console.log(val)
- _self.$refs['mapToolBarRef'].getLocationFromMap(val,_self.longLat);
- _self.$refs['mapToolBarRef'].showDaoHang();
- if(_self.menu_overlay){
- _self.menu_overlay.setPosition(undefined);
- }
- },
- },
- }
- </script>
- <style>
- /*@import url(); 引入公共css类*/
- .ol-popup {
- position: absolute;
- background-color: white;
- -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
- filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
- padding: 10px;
- border-radius: 10px;
- border: 1px solid #cccccc;
- bottom: 12px;
- left: -49px;
- min-width: 80px;
- text-align: center;
- z-index: 100;
- }
- .ol-popup:after, .ol-popup:before {
- top: 100%;
- border: solid transparent;
- content: " ";
- height: 0;
- width: 0;
- position: absolute;
- pointer-events: none;
- }
- .ol-popup:after {
- border-top-color: white;
- border-width: 10px;
- left: 48px;
- margin-left: -10px;
- }
- .ol-popup:before {
- border-top-color: #cccccc;
- border-width: 11px;
- left: 48px;
- margin-left: -11px;
- }
- .ol-popup-closer {
- text-decoration: none;
- position: absolute;
- top: 2px;
- right: 8px;
- }
- .ol-popup-closer:after {
- content: "✖";
- }
- #baseMapContainer .el-input__inner{
- color:#2C9EFF;
- font-size: 14px;
- border: 0px !important;
- }
- #mapContent .el-select .el-input .el-select__caret{
- color:#2C9EFF;
- }
- .rightMenuClass{
- left: 3px;
- position: absolute;
- background-color: #ffffffad;
- width: 90px;
- border: 1px solid #8c8b8b;
- box-shadow: 0 2px 15px 2px rgba(0, 0, 0, 0.6);
- border-radius: 13px;
- padding: 10px;
- border-top-left-radius: 0px;
- }
- .rightMenuClass p{
- padding: 3px 3px;
- margin: 0px 2px;
- line-height: 17px;
- width: 84px;
- color: rgb(101, 101, 101);
- cursor: pointer;
- /* border-bottom: 1px solid #bbb; */
- }
- </style>
|