3723a8d90fc4e81ea27629be18bc6660f8436ff2.svn-base 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. <!--地图主组件-->
  2. <template>
  3. <div id="mapContent" style="height:100%;">
  4. <!-- 地图容器 -->
  5. <div id="mapNode" style="width:100%;height:100%;"></div>
  6. <!-- 名称弹窗 -->
  7. <div id="popup" class="ol-popup" style="display:none;">
  8. <div id="popup-content"></div>
  9. </div>
  10. <!-- 鼠标右键菜单 -->
  11. <div id="rightMenuContainer" class="rightMenuClass">
  12. <p style="border-bottom: 1px solid #bbb;" @click="rightMenuClick('start')">从这里出发</p>
  13. <p style="padding-top: 5px;" @click="rightMenuClick('end')">到这里去</p>
  14. </div>
  15. <!-- 标记弹窗 -->
  16. <div id="popupbj" class="ol-popup" style="display:none;">
  17. <!-- <a href="#" id="popup-closerbj" class="ol-popup-closer"></a> -->
  18. <div id="popup-contentbj">
  19. <!-- 弹窗内容 -->
  20. </div>
  21. </div>
  22. <!-- 地图小工具 -->
  23. <mapToolBar
  24. ref="mapToolBarRef"
  25. :view=viewObject
  26. :map=mapObject
  27. :fullExtent="fullExtent"
  28. @clickAd="clickAd"
  29. @hide=hidehandlerTool
  30. @eventHandler="mapToolBarHandler">
  31. </mapToolBar>
  32. <!-- 图层树 -->
  33. <layerTree ref="layerTreeRef" @hide=hidehandlerTree @leftLayerMenuClick="layerChange"></layerTree>
  34. <!-- 底图切换 -->
  35. <div id="baseMapContainer" style="position: absolute;right: 10px;top: 106px;width: 89px;display: flex;align-items: center;font-size:14px;">
  36. <img src="./assets/basemap.png">
  37. <el-select v-model="radio4" placeholder="请选择" @visible-change="closePanel" @change="baseMapChange">
  38. <el-option
  39. v-for="item in mapOptions"
  40. :key="item.value"
  41. :label="item.label"
  42. :value="item.value">
  43. </el-option>
  44. </el-select>
  45. </div>
  46. <!-- 标记列表 -->
  47. <myBiaoJi
  48. ref="myBiaoJiRef"
  49. v-if="showBiaojiTable"
  50. @emitBiaoJiTableData="emitBiaoJiTableData"
  51. @showBiaoJi="tableRowClick"
  52. @closeDraggable="closeDraggable">
  53. </myBiaoJi>
  54. <!-- 一张图查询处理及结果列表展示 -->
  55. <searchOneMapResult
  56. v-if="showSearchOneMap"
  57. :viewObj = viewObject
  58. :mapObj = mapObject
  59. :mapPointObj = mapPointObj
  60. :layerList = leftLayersAddedList
  61. :bufferDistance = bufferDistance1
  62. @emit_searchOneMapTimeData="emit_searchOneMapTimeData"
  63. @closeDraggable="closeDraggable">
  64. </searchOneMapResult>
  65. <!-- 水利一张图 查询实时数据 -->
  66. <oneMapRealTimeData ref="oneMapRealTimeDataRef"
  67. v-show="showRealTimeData"
  68. @closeDraggable="closeDraggable">
  69. </oneMapRealTimeData>
  70. </div>
  71. </template>
  72. <script>
  73. import "ol/ol.css";
  74. import {dateFormat} from "../../utils/gw_date.js"
  75. //config
  76. import {baseLayerOptions_ol,mapExtent} from './config/lyrConfig.js'
  77. //init
  78. import {getPersonList} from './js/getPersonList.js'
  79. import {getProjectList} from './js/getProjectList.js'
  80. import {addBaseLayer} from './js/addBaseLayer.js'
  81. import {getPerTrack} from './js/getPerTrack.js'//获取人员轨迹
  82. import {perGzqkOnMap} from './js/perGzqkOnMap.js'//地图上展示人员轨迹 点
  83. //handler
  84. import {baseMapChangeHandler} from './js/baseMapChange.js' //底图切换
  85. import {xzqChange} from './js/xzqChange.js' //切换行政区
  86. import {pointMoveHandler} from './js/pointMoveHandler.js'//鼠标移动事件
  87. import {locationHandler} from './js/locationHandler.js' //定位响应方法
  88. import {biaojiHandler,getBiaoJiList} from './js/biaojiHandler.js' //标记
  89. import {addOneMapLayer} from './js/addOneMap.js' //添加一张图图层
  90. import {refreshLayerData} from './js/refreshLayerData.js'//地图范围发生变化之后 如果图层处于显示状态 则刷新数据
  91. import {addInterest,editInterest} from '../../api/zhxxAPI.js'//添加兴趣点
  92. import {removeLayerById} from './js/removeLayerById.js'
  93. export default {
  94. props:['select_nd','select_pc','select_xmlx'],
  95. components: {
  96. layerTree:resolve => {require(['./components/layerTree.vue'],resolve)},
  97. mapToolBar:resolve => {require(['./mapTool/mapToolBar.vue'],resolve)},
  98. myBiaoJi:resolve => {require(['./components/myBiaoJiTable'],resolve)},
  99. searchOneMapResult:resolve => {require(['./components/searchOneMapResult.vue'],resolve)},
  100. oneMapRealTimeData:resolve => {require(['./components/oneMapRealTimeData.vue'],resolve)},
  101. },
  102. data() {
  103. return {
  104. loading:true,
  105. radio4:'影像',//底图切换radiobutton
  106. mapObject:null,
  107. viewObject:null,
  108. fullExtent:'',
  109. initOptions:null,//各图层option
  110. popupDelay:'',//延时弹出
  111. currentRsCode:'1111111',
  112. currentStatus:'',
  113. currentLocation:'',
  114. zoomnext:'',
  115. currentExtent:'',
  116. timeInterval_people:'',//定时刷新人员
  117. currentChangeGraphicLayerId:'',//当前graphic类型变化的图层id
  118. currentChangeGraphicId:'',
  119. tileInfo:'',//高德切片信息
  120. biaojiFlag:false,
  121. showBiaojiTable:false,
  122. currentAdCode:'',
  123. leftLayersAddedList:[],//左侧图层已经添加列表 为一张图查询做支撑
  124. showSearchOneMapToolTip:false,//一张图查询开关
  125. showSearchOneMap:false,//一张图空间查询结果
  126. mapPointObj:null,
  127. bufferDistance1:10,//缓冲距离
  128. showRealTimeData:false,//水利一张图实时数据查询列表
  129. currentZoom:0,//当前底图level
  130. mapOptions:[
  131. {
  132. value: '影像',
  133. label: '影像'
  134. }, {
  135. value: '谷歌',
  136. label: '谷歌'
  137. }, {
  138. value: '高德',
  139. label: '高德'
  140. }
  141. ],
  142. menu_overlay:null,
  143. longLat:[],
  144. };
  145. },
  146. computed: {
  147. userId: function () {
  148. return localStorage.getItem("userid") ?localStorage.getItem("userid") : "1098101939614724096";
  149. },
  150. },
  151. watch: {
  152. select_nd(n,o){
  153. this.select_nd = n;
  154. this.parentSearchEvent();
  155. },
  156. select_pc(n,o){
  157. this.select_pc = n;
  158. this.parentSearchEvent();
  159. },
  160. select_xmlx(n,o){
  161. this.select_xmlx = n;
  162. this.parentSearchEvent();
  163. },
  164. },
  165. //生命周期 - 创建完成(可以访问当前this实例)
  166. created() {
  167. },
  168. //生命周期 - 挂载完成(可以访问DOM元素)
  169. mounted() {
  170. this.initOptions = baseLayerOptions_ol;
  171. this.initMap();
  172. },
  173. beforeCreate() {}, //生命周期 - 创建之前
  174. beforeMount() {}, //生命周期 - 挂载之前
  175. beforeUpdate() {}, //生命周期 - 更新之前
  176. updated() {}, //生命周期 - 更新之后
  177. beforeDestroy() {}, //生命周期 - 销毁之前
  178. destroyed() {}, //生命周期 - 销毁完成
  179. activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
  180. methods: {
  181. parentSearchEvent(){
  182. getPersonList(this);
  183. getProjectList(this);
  184. },
  185. initMap(){//初始化地图
  186. var _self = this;
  187. var ol = _self.$ol;
  188. var layers = [];
  189. _self.initOptions.forEach((item)=>{//所有底图
  190. var lyr = new ol.layer.Tile({
  191. id:item.id,
  192. source: new ol.source.XYZ({
  193. crossOrigin: 'anonymous',
  194. url: item.urlTemplate
  195. }),
  196. name: item.name,
  197. visible:item.visible
  198. });
  199. layers.push(lyr)
  200. })
  201. _self.mapObject = new ol.Map({
  202. layers:layers,
  203. view:new ol.View({
  204. center:mapExtent.center,
  205. zoom:mapExtent.zoom
  206. }),
  207. target:'mapNode'
  208. });
  209. _self.mapObject.on('click',_self.mapClickHandle);//点击事件
  210. _self.mapObject.on('moveend',_self.mapMoveHandler);//地图移动事件
  211. _self.mapObject.on('pointermove',_self.pointMoveHandle);//地图移动事件
  212. _self.initRightMenu();
  213. getPersonList(_self);//初始化 人员列表
  214. getProjectList(_self);//初始化 项目列表
  215. },
  216. initRightMenu(){
  217. var _self = this;
  218. var ol = _self.$ol;
  219. _self.menu_overlay = new ol.Overlay({
  220. element: document.getElementById("rightMenuContainer"),
  221. positioning: 'center-center'
  222. });
  223. _self.mapObject.addOverlay(_self.menu_overlay);
  224. $(_self.mapObject.getViewport()).on("contextmenu", function(event){
  225. event.preventDefault();//屏蔽自带的右键事件
  226. var pixel = [event.offsetX,event.offsetY];
  227. var feature = _self.mapObject.getFeaturesAtPixel(pixel);
  228. _self.longLat = [];
  229. // var arr = _self.mapObject.getCoordinateFromPixel(pixel);
  230. // _self.longLat.push(arr[0].toFixed(6));
  231. // _self.longLat.push(arr[1].toFixed(6));
  232. if(feature){
  233. // var coordinate = _self.mapObject.getEventCoordinate(event);
  234. var coordinate = feature[0].getGeometry().getCoordinates();
  235. _self.longLat.push(coordinate[0].toFixed(6));
  236. _self.longLat.push(coordinate[1].toFixed(6));
  237. _self.menu_overlay.setPosition(coordinate);
  238. }
  239. });
  240. },
  241. //地图点击事件
  242. mapClickHandle(e){
  243. var _self = this;
  244. _self.closePanel();
  245. if(_self.menu_overlay){
  246. _self.menu_overlay.setPosition(undefined);
  247. }
  248. console.log('x='+e.coordinate[0])
  249. console.log('y='+e.coordinate[1])
  250. var features = _self.mapObject.getFeaturesAtPixel(e.pixel);
  251. if(features){
  252. var obj = features[0].getProperties();
  253. // 判断是否点击的是矢量服务
  254. if(obj.elementtype){
  255. _self.$emit('showVectorLayerDetail',obj);
  256. }else if(obj.layer){
  257. if(obj.layer.indexOf('LAKE_')>-1 || obj.layer.indexOf('RIVER_')>-1){
  258. _self.$emit('showVectorLayerDetail',obj);
  259. }
  260. }
  261. console.log(features[0].getProperties().layerId);
  262. // mapClickHandler(_self,features[0].getProperties(),e);
  263. var layerId = features[0].getProperties().layerId;
  264. if(layerId == 'personGraphicLayer1' || layerId == 'personGraphicLayer0'){
  265. layerId = 'personGraphicLayer';
  266. }else{
  267. layerId = 'projectGraphicLayer';
  268. }
  269. _self.$emit('clickMapHandler',layerId,features[0].getProperties());
  270. }
  271. if(_self.biaojiFlag){//如果处于标记状态
  272. biaojiHandler(_self,e.coordinate[0],e.coordinate[1]);
  273. _self.biaojiFlag = false;
  274. document.getElementById("mapNode").style.cursor = "default";
  275. }else if(_self.showSearchOneMapToolTip){
  276. _self.showSearchOneMapToolTip = false;
  277. _self.showSearchOneMap = true;
  278. _self.mapPointObj = [e.coordinate[0],e.coordinate[1]];
  279. }
  280. },
  281. // 地图移动之后触发
  282. mapMoveHandler(e){
  283. // console.log(e);
  284. refreshLayerData(this);
  285. },
  286. //鼠标移动事件
  287. pointMoveHandle(e){
  288. var _self =this;
  289. if (e.dragging) {
  290. return;
  291. }
  292. var overlay = _self.mapObject.getOverlayById('ls_pointerMoveOverlayId');
  293. if(overlay){
  294. if(document.getElementById('popup')){
  295. document.getElementById('popup').style.display = 'none'
  296. }
  297. }
  298. if(_self.menu_overlay.getPosition()){
  299. return;
  300. }
  301. var features = _self.mapObject.getFeaturesAtPixel(e.pixel);
  302. if(features){
  303. // console.log(features[0].getProperties());
  304. if(features[0].getProperties().layerId){
  305. pointMoveHandler(_self,features[0].getProperties(),e);
  306. }else{
  307. pointMoveHandler(_self,features[0].getProperties(),e);
  308. }
  309. }
  310. this.$refs['mapToolBarRef'].clearLayer();
  311. },
  312. // 底图切换处理方法
  313. baseMapChange(val){//底图切换
  314. baseMapChangeHandler(this.mapObject,val);
  315. },
  316. layerChange(item){//左侧图层控制
  317. //debugger
  318. var _self = this;
  319. if(item.id.substring(0,7) == 'oneMap_'){
  320. //添加一张图服务
  321. addOneMapLayer(this,this.mapObject,item,this.leftLayersAddedList);
  322. }else{
  323. if(item.checked){//是否选中的时候再去请求数据
  324. // layerHangeHandler(_self,item)
  325. }
  326. this.mapObject.getLayers().forEach((val)=>{
  327. if(item.id=='skGraphicLayer2019' || item.id=='fcskGraphicLayer' || item.id=='shgcGraphicLayer' ||
  328. item.id=='ydbGraphicLayer' || item.id=='szy_sydGraphicLayer' || item.id=='szy_qyshGraphicLayer' ||
  329. item.id=='personGraphicLayer' || item.id=='szy_jsglGraphicLayer' || item.id=='szy_ysdwGraphicLayer'){
  330. var arr = [0,1,2];
  331. arr.forEach((v)=>{
  332. if(val.getProperties().id == item.id+v){
  333. val.setVisible(item.checked);
  334. return;
  335. }
  336. })
  337. }else{
  338. if(val.getProperties().id == item.id){
  339. val.setVisible(item.checked);
  340. return;
  341. }
  342. }
  343. })
  344. this.$emit('isChecks1',item);
  345. }
  346. },
  347. clickAd(item){//右上角工具条 切换行政区
  348. this.currentAdCode = item.adCode;
  349. this.$emit('currentAdCodeChange',this.currentAdCode);
  350. xzqChange(this,this.mapObject,item,this.fullExtent);
  351. },
  352. mapToolBarHandler(item){
  353. if(item == 'biaoji'){//标记
  354. this.biaojiFlag = true;
  355. this.showBiaojiTable = true;
  356. }else if(item == "chaxun"){
  357. this.showSearchOneMapToolTip = !this.showSearchOneMapToolTip;
  358. if(!this.showSearchOneMapToolTip){
  359. this.closeDraggable('searchOneMap');
  360. document.getElementById("mapNode").style.cursor = "default";
  361. }else{
  362. document.getElementById("mapNode").style.cursor = "crosshair";
  363. }
  364. }else if(item == 'jietu'){
  365. this.mapObject.once('postcompose', function (event) {
  366. var filename = 'map.png';
  367. var canvas = event.context.canvas;
  368. if (navigator.msSaveBlob) {
  369. navigator.msSaveBlob(canvas.msToBlob(), filename);
  370. } else {
  371. canvas.toBlob(function (blob) {
  372. saveAs(blob, 'map.png');
  373. });
  374. }
  375. });
  376. this.mapObject.renderSync();
  377. }
  378. },
  379. //图例控制图层显隐
  380. lengendChangeHandler(item){
  381. var _self = this;
  382. _self.mapObject.getLayers().forEach((val)=>{
  383. if(val){
  384. if(val.getProperties().id == item.id){
  385. val.setVisible(!val.getVisible());
  386. }
  387. }
  388. })
  389. },
  390. //点击地图 关闭右上角所有打开面板
  391. closePanel(){
  392. this.$refs['mapToolBarRef'].hide();
  393. this.$refs['layerTreeRef'].hide();
  394. },
  395. hidehandlerTool(){
  396. this.$refs['layerTreeRef'].hide();
  397. },
  398. hidehandlerTree(){
  399. this.$refs['mapToolBarRef'].hide();
  400. },
  401. emitBiaoJiTableData(item){
  402. getBiaoJiList(this,item);
  403. },
  404. closeDraggable(item){
  405. document.getElementById("mapNode").style.cursor = "default";
  406. if(item == "myBj"){
  407. this.showBiaojiTable = false;
  408. this.biaojiFlag = false;
  409. removeLayerById(this,'ls_bjGraphicLayer');
  410. }else if(item == "searchOneMap"){
  411. this.showSearchOneMap = false;
  412. this.showSearchOneMapToolTip = false;
  413. }else if(item == "searchOneMapRealTimeData"){
  414. this.showRealTimeData = false;
  415. }
  416. },
  417. tableRowClick(item,type,obj,layerId){//列表交互
  418. if(type == "locate"){//定位
  419. locationHandler(this,item,obj,layerId);
  420. }else if(type == "track"){
  421. getPerTrack(this,item,obj);
  422. }
  423. },
  424. saveBjHandler(ptx,pty){//保存标记
  425. var _self = this;
  426. var nameContent = document.getElementById('nameId').value
  427. if(!nameContent){
  428. this.$message({
  429. message: '请输入名称',
  430. type: 'warning'
  431. });
  432. return;
  433. }
  434. var noteContent = document.getElementById('noteId').value
  435. var timeStr = dateFormat(new Date(),'yyyy-MM-dd HH:mm:ss')
  436. addInterest(noteContent,nameContent,timeStr,ptx,pty,this.userId).then((res)=>{
  437. if(res.success){
  438. _self.$message.success("添加成功");
  439. if(_self.$refs['myBiaoJiRef']){
  440. _self.$refs['myBiaoJiRef'].getMyBjList();
  441. }
  442. if(document.getElementById('popupbj')){
  443. document.getElementById('popupbj').style.display = 'none'
  444. }
  445. }
  446. });
  447. },
  448. // 查询实时数据
  449. emit_searchOneMapTimeData:function(tableHeader,tableData){
  450. this.showRealTimeData = true;
  451. this.$refs["oneMapRealTimeDataRef"].getTableData(tableHeader,tableData);
  452. },
  453. //在地图上展示人员工作情况 轨迹
  454. showPerGzqkOnMap(item){
  455. perGzqkOnMap(this,item);
  456. },
  457. clearLayer(){
  458. var _self = this;
  459. _self.mapObject.getLayers().forEach((val)=>{
  460. if(val){
  461. if(val.getProperties().id.substring(0,3) == 'ls_'){
  462. val.getSource().clear();
  463. _self.mapObject.removeLayer(val);
  464. }
  465. }
  466. });
  467. },
  468. rightMenuClick(val){
  469. let _self = this;
  470. console.log(val)
  471. _self.$refs['mapToolBarRef'].getLocationFromMap(val,_self.longLat);
  472. _self.$refs['mapToolBarRef'].showDaoHang();
  473. if(_self.menu_overlay){
  474. _self.menu_overlay.setPosition(undefined);
  475. }
  476. },
  477. },
  478. }
  479. </script>
  480. <style>
  481. /*@import url(); 引入公共css类*/
  482. .ol-popup {
  483. position: absolute;
  484. background-color: white;
  485. -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
  486. filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
  487. padding: 10px;
  488. border-radius: 10px;
  489. border: 1px solid #cccccc;
  490. bottom: 12px;
  491. left: -49px;
  492. min-width: 80px;
  493. text-align: center;
  494. z-index: 100;
  495. }
  496. .ol-popup:after, .ol-popup:before {
  497. top: 100%;
  498. border: solid transparent;
  499. content: " ";
  500. height: 0;
  501. width: 0;
  502. position: absolute;
  503. pointer-events: none;
  504. }
  505. .ol-popup:after {
  506. border-top-color: white;
  507. border-width: 10px;
  508. left: 48px;
  509. margin-left: -10px;
  510. }
  511. .ol-popup:before {
  512. border-top-color: #cccccc;
  513. border-width: 11px;
  514. left: 48px;
  515. margin-left: -11px;
  516. }
  517. .ol-popup-closer {
  518. text-decoration: none;
  519. position: absolute;
  520. top: 2px;
  521. right: 8px;
  522. }
  523. .ol-popup-closer:after {
  524. content: "✖";
  525. }
  526. #baseMapContainer .el-input__inner{
  527. color:#2C9EFF;
  528. font-size: 14px;
  529. border: 0px !important;
  530. }
  531. #mapContent .el-select .el-input .el-select__caret{
  532. color:#2C9EFF;
  533. }
  534. .rightMenuClass{
  535. left: 3px;
  536. position: absolute;
  537. background-color: #ffffffad;
  538. width: 90px;
  539. border: 1px solid #8c8b8b;
  540. box-shadow: 0 2px 15px 2px rgba(0, 0, 0, 0.6);
  541. border-radius: 13px;
  542. padding: 10px;
  543. border-top-left-radius: 0px;
  544. }
  545. .rightMenuClass p{
  546. padding: 3px 3px;
  547. margin: 0px 2px;
  548. line-height: 17px;
  549. width: 84px;
  550. color: rgb(101, 101, 101);
  551. cursor: pointer;
  552. /* border-bottom: 1px solid #bbb; */
  553. }
  554. </style>