From 2e41623f7fd7fd4f01b08cda81012edc9c573d91 Mon Sep 17 00:00:00 2001
From: guanqb <18720758508@163.com>
Date: Tue, 28 Feb 2023 14:18:49 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.105:10010/r/srs-police-web

---
 src/components/map/mapBox.vue |  171 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 98 insertions(+), 73 deletions(-)

diff --git a/src/components/map/mapBox.vue b/src/components/map/mapBox.vue
index 872acff..67a5ce4 100644
--- a/src/components/map/mapBox.vue
+++ b/src/components/map/mapBox.vue
@@ -1,10 +1,10 @@
 <template>
   <div>
-    <div id='map' :style="{height:isDetail?'90vh':'40vh',width:'100%'}">
+    <div id='map' :style="{ height: isDetail ? '90vh' : '40vh', width: '100%' }" ref="MapContent">
       <div style="position: absolute;right:40%;top:-1%;z-index: 999999">
         <p style="margin-top: 10px" v-if="!isDetail">
-          <el-button type="primary" size="small" @click="point()">绘制路线</el-button>
-          <el-button  size="small" @click="clearDraw()">重置</el-button>
+          <el-button type="primary" size="small" @click="point()">绘制区域</el-button>
+          <el-button size="small" @click="clearDraw()">重置</el-button>
         </p>
       </div>
       <!--画线后的提示-->
@@ -21,18 +21,18 @@
 import VectorSource from 'ol/source/Vector'
 import Cluster from 'ol/source/Cluster'
 import {Vector as VectorLayer, Tile as TileLayer} from 'ol/layer'
-import LineString from "ol/geom/LineString";
-import Point from 'ol/geom/Point';
-import Icon from 'ol/style/Icon';
+import LineString from "ol/geom/LineString"
+import Point from 'ol/geom/Point'
+import Icon from 'ol/style/Icon'
 import {Style, Fill as StyleFill, Stroke as StyleStroke, Text as StyleText, Circle as StyleCircle} from 'ol/style'
 import {Circle as GeomCircle, Point as GeomPoint, LineString as GeomLineString, Polygon as GeomPolygon} from 'ol/geom'
 import Draw from 'ol/interaction/Draw'
-import XYZ from "ol/source/XYZ";
+import XYZ from "ol/source/XYZ"
 import 'ol/ol.css'
 
 export default {
   name: 'mapBox',
-  props:['routeRange','isDetail'],
+  props: ['routeRange', 'isDetail', "searchMap"],
   data() {
     return {
       map: null,
@@ -44,15 +44,16 @@
       draw: null,
       drawLayer: null,
       lineVector: null,
-      pointVector:null,
+      pointVector: null,
+      polygonVector: null,
       coordinates: [],// 保存绘画坐标地址   [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717]]
       toData: null,// 保存数据库格式坐标地址
-      showTip:false,
+      showTip: false,
       tipPosition: {//提示的位置
         w: 200,
         h: 10,
       },
-      tipTitle:null
+      tipTitle: null
     }
   },
   methods: {
@@ -72,7 +73,7 @@
         ],
         view: new View({
           // 设置中心点,默认南昌,用于规划南昌市的路线
-          center: [115.9032747077233, 28.67433116990186],
+          center: [117.951478782, 28.447896798],
           projection: 'EPSG:4326',
           // 设置缩放倍数
           zoom: 13,
@@ -80,6 +81,7 @@
           maxZoom: 19
         })
       })
+
       _this.lineVector = new VectorLayer({
         //layer所对应的source
         source: new VectorSource({
@@ -92,8 +94,15 @@
           wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
         }),
       })
+      _this.polygonVector = new VectorLayer({
+        //layer所对应的source
+        source: new VectorSource({
+          wrapX: false // 禁止横向无限重复(底图渲染的时候会横向无限重复),设置了这个属性,可以让绘制的图形不跟随底图横向无限重复
+        }),
+      })
       _this.map.addLayer(_this.lineVector)
       _this.map.addLayer(_this.pointVector)
+      _this.map.addLayer(_this.polygonVector)
       //在地图上回显线或点
       _this.startAdd(_this.routeRange)
     },
@@ -116,41 +125,41 @@
       // toData = 'LINESTRING(115.90505364627936 28.740342332731327,115.9119724729309 28.74040302419318,115.90766337913915 28.73566909016844)'
       if (toData) {
         // 将数据库点坐标数据转换
-        let entityData = "";
-        let entityArr = [];
-        entityData = toData.match(/\(([^)]*)\)/);
+        let entityData = ""
+        let entityArr = []
+        entityData = toData.match(/\(([^)]*)\)/)
         if (entityData && entityData != "") {
-          entityData = entityData[1].split(",");
+          entityData = entityData[1].split(",")
           for (let j = 0; j < entityData.length; j++) {
             entityArr.push([
               Number(entityData[j].split(" ")[0]),
               Number(entityData[j].split(" ")[1]),
-            ]);
+            ])
           }
         }
         // let lineCoords = [[115.90490549080435, 28.746101718722358],[115.93151300423209, 28.741123538790717],[115.90696542732779, 28.73408542233564],[115.90696542732779, 28.73408542233564]]
         let lineCoords = entityArr
-        let view = this.map.getView();
+        let view = this.map.getView()
         view.setCenter([
           lineCoords[Math.ceil(lineCoords.length / 2)][0],
           lineCoords[Math.ceil(lineCoords.length / 2)][1],
-        ]);
-        view.setZoom(14.5);
+        ])
+        view.setZoom(14.5)
 
         let feature_LineString = new Feature({
           geometry: new LineString(lineCoords),
-        });
-        feature_LineString.setStyle(this.styleFunction());// 设置样式
-        this.lineVector.getSource().addFeature(feature_LineString);
+        })
+        feature_LineString.setStyle(this.styleFunction())// 设置样式
+        this.lineVector.getSource().addFeature(feature_LineString)
       }
     },
     // 添加点
-    addPoint(pointLonLat){
+    addPoint(pointLonLat) {
       // pointLonLat = POINT(115.87531914674 28.8603307485585)
-      if (pointLonLat){
+      if (pointLonLat) {
         let pointData = ""
         let pointArray = []
-        pointData = pointLonLat.match(/\(([^)]*)\)/);
+        pointData = pointLonLat.match(/\(([^)]*)\)/)
         pointArray = pointData[1].split(" ")
         //设置点
         let feature_Point = new Feature({
@@ -164,53 +173,63 @@
             // imgSize: [250,320],
             scale: 0.2
           }),
-        });
-        feature_Point.setStyle(style);
-        this.pointVector.getSource().addFeature(feature_Point);
-        let center = [Number(pointArray[0]), Number(pointArray[1])];
-        let view = this.map.getView();
-        view.setZoom(16);
+        })
+        feature_Point.setStyle(style)
+        this.pointVector.getSource().addFeature(feature_Point)
+        let center = [Number(pointArray[0]), Number(pointArray[1])]
+        let view = this.map.getView()
+        view.setZoom(16)
         view.animate({
           center: center,
           duration: 5,
-        });
+        })
       }
     },
     // 将点坐标集合转换为数据库数据
     doData(val) {
-      let str = "LINESTRING(";
+      let str = "LINESTRING("
       for (let k = 0; k < val.length; k++) {
-        str += `${val[k][0]} ${val[k][1]}`;
+        str += `${val[k][0]} ${val[k][1]}`
         if (k != val.length - 1) {
-          str += ",";
+          str += ","
         }
       }
-      str += ")";
+      str = str + "," + `${val[0][0]} ${val[0][1]}`
+      str += ")"
       // console.log(str)
-      return '\''+str+'\'';
+      return '\'' + str + '\''
     },
     // 开始绘制
     point() {
       let _this = this
       _this.coordinates = []
       _this.map.removeInteraction(_this.draw)
-      _this.lineVector.getSource().clear()
+      _this.polygonVector.getSource().clear()
       //提示
-      if(!_this.showTip){
+      if (!_this.showTip) {
         _this.showTip = true
       }
       _this.tipTitle = "单击左键或者右键开始绘画"
+
       //提示器
-      $("#map").off("mousemove").mousemove(function (e) {
-        _this.setTipPosition(e.offsetX, e.offsetY, 5, 5);
-      })
-      $("#map").off("mousedown").mousedown(function () {
+      function mapMousemove(e) {
+        _this.setTipPosition(e.offsetX, e.offsetY, 5, 5)
+      }
+
+      this.$refs.MapContent.addEventListener('mousemove', mapMousemove)
+
+      // this.$refs.MapContent.removeEventListener('mousemove', mapMousemove)
+
+      function mapMousedown() {
         _this.tipTitle = "可继续,或选择最终位置双击结束绘画"
-      })
+      }
+
+      this.$refs.MapContent.addEventListener('mousedown', mapMousedown)
+      // this.$refs.MapContent.removeEventListener('mousedown', mapMousedown)
 
       _this.draw = new Draw({
-        source: _this.lineVector.getSource(),
-        type: 'LineString',
+        source: _this.polygonVector.getSource(),
+        type: 'Polygon',
         style: new Style({
           stroke: new StyleStroke({
             color: "red",
@@ -227,16 +246,17 @@
       // 结束事件
       _this.draw.on('drawend', function () {
 
-        _this.map.removeInteraction(_this.draw);
-        _this.lineVector.setStyle(_this.styleFunction())// 路线画好之后的样式
+        _this.map.removeInteraction(_this.draw)
+        _this.polygonVector.setStyle(_this.styleFunction())// 路线画好之后的样式
         // 将点坐标集合转换为数据库数据
         let toData = _this.doData(_this.coordinates)
         // 传值给父组件
-        _this.$emit('toData',toData)
+        _this.$emit('toData', toData)
         //隐藏提示
-        _this.tipTitle = null;
+        _this.tipTitle = null
         _this.showTip = false
       })
+
     },
     // 设置统一控制点击事件,需要画图方式在此处切换
     handleClick(point) {
@@ -263,7 +283,7 @@
       this.linePoints.push(point)
       let featureLine = new Feature({
         geometry: new GeomLineString(this.linePoints),
-      });
+      })
 
       // 添加线的样式
       let lineStyle = new Style({
@@ -274,8 +294,8 @@
           color: 'rgba(255, 0, 0)',
           width: 4,
         }),
-      });
-      featureLine.setStyle(lineStyle);
+      })
+      featureLine.setStyle(lineStyle)
 
       let source = new VectorSource()
       source.addFeature(featureLine)
@@ -299,7 +319,7 @@
       let feature = new Feature({
         geometry: new GeomPolygon([this.polygonPoints]),
         attributes: null
-      });
+      })
       // 添加线的样式
       let lineStyle = new Style({
         fill: new StyleFill({
@@ -309,9 +329,9 @@
           color: 'rgba(255, 0, 0)',
           width: 4,
         }),
-      });
-      feature.setStyle(lineStyle);
-      let source = new VectorSource();
+      })
+      feature.setStyle(lineStyle)
+      let source = new VectorSource()
       source.addFeature(feature)
       let vectorLayer = new VectorLayer({
         source: source
@@ -320,12 +340,12 @@
     },
     // 设置聚合点
     addMarker() {
-      let source = new VectorSource();
+      let source = new VectorSource()
       // 随机创建200个要素,后台点位取出后按此格式处理
       for (let i = 1; i <= 200; i++) {
-        let coordinates = [115.90 + Math.random() * 0.05, 28.64 + Math.random() * 0.05];
-        let feature = new Feature(new GeomPoint(coordinates));
-        source.addFeature(feature);
+        let coordinates = [115.90 + Math.random() * 0.05, 28.64 + Math.random() * 0.05]
+        let feature = new Feature(new GeomPoint(coordinates))
+        source.addFeature(feature)
       }
 
       // 聚合
@@ -337,7 +357,7 @@
       let clusters = new VectorLayer({
         source: clusterSource,
         style: function (feature) {
-          let size = feature.get('features').length;
+          let size = feature.get('features').length
           let style = new Style({
             image: new StyleCircle({
               radius: 20,
@@ -355,20 +375,23 @@
               })
             })
           })
-          return style;
+          return style
         }
-      });
+      })
 
       this.map.addLayer(clusters)
     },
     // 重置图层
-    clearDraw(){
+    clearDraw() {
       let _this = this
       _this.coordinates = []
       _this.map.removeInteraction(_this.draw)
       _this.lineVector.getSource().clear()
       _this.showTip = false
       _this.tipTitle = null
+
+      // 传值给父组件
+      _this.$emit('toData', "")
     },
     // 获取新的 layer 图层对象
     getLayer() {
@@ -394,14 +417,16 @@
     // 设置提示位置
     setTipPosition(x, y, n, m) {
       let _this = this
-      _this.tipPosition.w = x + n;
-      _this.tipPosition.h = y + m;
+      _this.tipPosition.w = x + n
+      _this.tipPosition.h = y + m
     },
-    startAdd(routeRange){
-      if (routeRange.startsWith("LINESTRING")){
-        this.addLineDraw(routeRange)
-      }else {
-        this.addPoint(routeRange)
+    startAdd(routeRange) {
+      if (routeRange) {
+        if (routeRange.startsWith("LINESTRING")) {
+          this.addLineDraw(routeRange)
+        } else if (routeRange.startsWith("POINT")) {
+          this.addPoint(routeRange)
+        }
       }
     }
   },

--
Gitblit v1.9.3