gaodeMap.js 23 KB
Newer Older
耿迪迪's avatar
耿迪迪 committed
1
import createPop from "./createPop";
纪泽龙's avatar
纪泽龙 committed
2 3 4
import regulatorBox from "../components/PopWindow/regulatorBox.vue";
import valveWell from "../components/PopWindow/valveWell.vue";
import flowMeter from "../components/PopWindow/flowMeter.vue";
纪泽龙's avatar
纪泽龙 committed
5 6
import pipelineView from "../components/PopWindow/pipelineView.vue";
import lineInfoWindow from "../components/PopWindow/lineInfoWindow.vue";
纪泽龙's avatar
纪泽龙 committed
7
import { delDeviceInfo } from "@/api/device/deviceInfo";
耿迪迪's avatar
耿迪迪 committed
8
import markerInfoWindow from "../components/PopWindow/markerInfoWindow.vue";
纪泽龙's avatar
纪泽龙 committed
9 10
import { getArray } from "@/utils/gassafety.js";
import { delPipe } from "@/api/device/pipe.js";
纪泽龙's avatar
纪泽龙 committed
11
import vue from "../main";
耿迪迪's avatar
耿迪迪 committed
12
let defaultCenter = "石家庄";
耿迪迪's avatar
耿迪迪 committed
13
export let map;
14
export const DEVICE_TYPE = {
纪泽龙's avatar
纪泽龙 committed
15 16 17 18
  PIPEPLINE: "1",
  REGEULATORBOX: "2",
  VALUEWELL: "3",
  FLOWMETER: "4",
yaqizhang's avatar
yaqizhang committed
19
  DUTYPERSON: "5",
20 21
  WORKORDER: "6",
  PRESSUREGAGE: "7"
纪泽龙's avatar
纪泽龙 committed
22
};
耿迪迪's avatar
耿迪迪 committed
23
class gaodeMap {
纪泽龙's avatar
纪泽龙 committed
24 25 26 27 28 29
  // 所有线的数组
  polyLines = [];
  // 是否开启新增
  lineType = 0;
  // 创建一个新的lineObj
  newLineObj = null;
纪泽龙's avatar
纪泽龙 committed
30 31
  // onceFlag=false;
  lineFlag = false;
纪泽龙's avatar
纪泽龙 committed
32
  mouseTool = null;
纪泽龙's avatar
纪泽龙 committed
33
  myMap = null;
纪泽龙's avatar
纪泽龙 committed
34
  showInfoWindow = null;
纪泽龙's avatar
纪泽龙 committed
35

耿迪迪's avatar
耿迪迪 committed
36 37
  //构造函数中设置中央点默认值
  constructor(center) {
38
    this.markers = [];
纪泽龙's avatar
纪泽龙 committed
39 40
    this.center = center ? center : defaultCenter;
    map = new AMap.Map("container", {
耿迪迪's avatar
耿迪迪 committed
41 42 43 44
      //mask: addMask(result.districtList[0].boundaries),
      center: [114.72995, 38.37417],
      // resizeEnable: true,
      disableSocket: true,
纪泽龙's avatar
纪泽龙 committed
45
      viewMode: "3D",
耿迪迪's avatar
耿迪迪 committed
46 47 48
      showLabel: true,
      // labelzIndex: 110,
      pitch: 8,
纪泽龙's avatar
纪泽龙 committed
49
      zoom: 9
耿迪迪's avatar
耿迪迪 committed
50 51 52
      //mapStyle: 'amap://styles/darkblue',
      // mapStyle: 'amap://styles/3b679a15f448a4740ba2ff7524e1a4ae',
    });
纪泽龙's avatar
纪泽龙 committed
53
    this.myMap = map;
纪泽龙's avatar
纪泽龙 committed
54

纪泽龙's avatar
纪泽龙 committed
55
    this.myMap.on("click", e => {
纪泽龙's avatar
纪泽龙 committed
56 57 58
      // if (this.lineType !=1 || this.lineFlag) return;
      if (this.lineType != 1 || this.lineFlag) return;

纪泽龙's avatar
纪泽龙 committed
59
      // 除了这里,还要利用vue页面的window事件辅助,当组件出来的时候,就得利用window事件
纪泽龙's avatar
纪泽龙 committed
60 61 62 63 64 65 66 67 68
      if (this.newLineObj) {
        vue
          .$confirm("是否重新画管道")
          .then(() => {
            this.newLineObj.polyEditor.close();
            map.remove(this.newLineObj);
            this.newLineObj = null;
            this.lineFlag = false;
            this.createNewLine();
纪泽龙's avatar
纪泽龙 committed
69

纪泽龙's avatar
纪泽龙 committed
70 71 72
            console.log("map点击事件新建");
          })
          .catch(() => {});
纪泽龙's avatar
纪泽龙 committed
73
      }
纪泽龙's avatar
纪泽龙 committed
74
      // console.log("抬起来了");
纪泽龙's avatar
纪泽龙 committed
75
    });
耿迪迪's avatar
耿迪迪 committed
76 77 78 79 80 81 82
    this.districtBoundaries();
  }

  /**
   * 获取map
   * @returns {AMap.Map}
   */
纪泽龙's avatar
纪泽龙 committed
83
  get getMap() {
耿迪迪's avatar
耿迪迪 committed
84 85 86 87 88 89 90
    return this.map;
  }

  /**
   * 重新设置中央点
   * @param value
   */
纪泽龙's avatar
纪泽龙 committed
91
  set setCenter(value) {
耿迪迪's avatar
耿迪迪 committed
92 93 94 95
    this.center = value;
    this.districtBoundaries();
  }

纪泽龙's avatar
纪泽龙 committed
96
  resetMapCenter(value) {
yaqizhang's avatar
yaqizhang committed
97 98 99
    map.setCenter(value);
  }

耿迪迪's avatar
耿迪迪 committed
100 101 102
  /**
   * 设置城市边界
   */
纪泽龙's avatar
纪泽龙 committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

  districtBoundaries() {
    let that = this;
    let opts = {
      subdistrict: 0,
      extensions: "all",
      level: "city"
    };
    let district = new AMap.DistrictSearch(opts);
    district.search(that.center, function(status, result) {
      if (status == "complete") {
        let defaultCenter = [];
        defaultCenter.push(result.districtList[0].center.lng);
        defaultCenter.push(result.districtList[0].center.lat);
        map.setCenter(defaultCenter);
        let bounds = result.districtList[0].boundaries;
        for (let i = 0; i < bounds.length; i += 1) {
          new AMap.Polyline({
            path: bounds[i],
            strokeColor: "#0088ff",
            strokeWeight: 5,
            strokeOpacity: 7,
            map: map
          });
        }
      }
    });
  }
耿迪迪's avatar
耿迪迪 committed
131 132 133

  /**
   * 添加Market
134
   * @param markerType
耿迪迪's avatar
耿迪迪 committed
135 136
   * @param lnglats
   */
耿迪迪's avatar
耿迪迪 committed
137
  addMarker(markerType, data) {
138 139
    let that = this;
    that.markerType = markerType;
纪泽龙's avatar
纪泽龙 committed
140 141
    let infoWindow = new AMap.InfoWindow({
      isCustom: true,
142
      offset: new AMap.Pixel(24, -38),
纪泽龙's avatar
纪泽龙 committed
143 144
      anchor: "left-top"
    });
耿迪迪's avatar
耿迪迪 committed
145
    let marker = new AMap.Marker({
纪泽龙's avatar
纪泽龙 committed
146
      position: [data.longitude, data.latitude],
耿迪迪's avatar
耿迪迪 committed
147
      map: map,
148
      offset: new AMap.Pixel(0, 5)
耿迪迪's avatar
耿迪迪 committed
149 150
    });
    this.setMarkerIcon(marker);
纪泽龙's avatar
纪泽龙 committed
151
    if (DEVICE_TYPE.WORKORDER != markerType) {
耿迪迪's avatar
耿迪迪 committed
152
      marker.content = this.getMarketContent(data);
yaqizhang's avatar
yaqizhang committed
153 154 155 156 157
      marker.on("mouseover", infoOpen);
      marker.on("mouseout", infoClose);
      marker.setExtData(data);
      that.deviceType = markerType;
      let editWindow = that.createInfowindow();
纪泽龙's avatar
纪泽龙 committed
158 159 160 161
      editWindow.fileArr =
        data.iconUrl != "" && data.iconUrl != undefined
          ? [{ url: data.iconUrl }]
          : [];
162 163 164
      editWindow.obj = marker;
      editWindow.gaoMap = that;
      editWindow.map = map;
yaqizhang's avatar
yaqizhang committed
165 166 167 168 169
      marker.on("click", function(e) {
        if ("edit" == that.mapOperateType) {
          editWindow.form = e.target.getExtData();
          editWindow.show();
        } else if ("delete" == that.mapOperateType) {
170 171 172 173 174 175 176 177 178 179 180 181 182 183
          vue.$confirm("是否删除"+e.target.getExtData().deviceName, "提示", {
              type: "warning"
              // center: true
            }).then(() => {
              map.remove(marker);
              that.deleteMarker(markerType, data.deviceId);
            }).catch(() => {
              vue.$message({
                type: "info",
                // center:true,
                offset: 100,
                message: "已取消删除"
              });
            });
yaqizhang's avatar
yaqizhang committed
184
        } else {
185
          //map.setZoomAndCenter(13, e.target.getPosition());
yaqizhang's avatar
yaqizhang committed
186 187
          let infoWindow = new AMap.InfoWindow({
            isCustom: true,
188
            offset: new AMap.Pixel(24, -38),
yaqizhang's avatar
yaqizhang committed
189 190 191 192
            anchor: "left-top"
          });
          infoWindow.setContent(e.target.content);
          infoWindow.open(map, e.target.getPosition());
193
        }
yaqizhang's avatar
yaqizhang committed
194 195 196 197 198 199
      });
      marker.on("dragend", function(e) {
        editWindow.form.longitude = e.lnglat.lng;
        editWindow.form.latitude = e.lnglat.lat;
      });
    }
耿迪迪's avatar
耿迪迪 committed
200

耿迪迪's avatar
耿迪迪 committed
201 202 203
    this.markers.push(marker);
    map.setZoom("11");
    //map.setFitView();
耿迪迪's avatar
耿迪迪 committed
204 205 206 207 208 209 210 211 212

    function infoClose(e) {
      infoWindow.close(map, e.target.getPosition());
    }

    function infoOpen(e) {
      infoWindow.setContent(e.target.content);
      infoWindow.open(map, e.target.getPosition());
    }
213 214
  }

耿迪迪's avatar
耿迪迪 committed
215 216 217
  /**
   * marker添加拖拽事件
   */
纪泽龙's avatar
纪泽龙 committed
218 219
  addMarkerDragg() {
    for (var i = 0; i < this.markers.length; i++) {
耿迪迪's avatar
耿迪迪 committed
220 221 222 223 224 225 226
      this.markers[i].setDraggable(true);
    }
  }

  /**
   * marker移除拖拽事件
   */
纪泽龙's avatar
纪泽龙 committed
227 228
  removeMarkerDragg() {
    for (var i = 0; i < this.markers.length; i++) {
耿迪迪's avatar
耿迪迪 committed
229 230 231 232
      this.markers[i].setDraggable(false);
    }
  }

纪泽龙's avatar
纪泽龙 committed
233 234 235 236 237 238
  /**
   * 添加marker信息
   * @param data
   * @returns {string}
   */
  getMarketContent(data) {
耿迪迪's avatar
耿迪迪 committed
239 240
    switch (this.markerType) {
      case DEVICE_TYPE.REGEULATORBOX: {
纪泽龙's avatar
纪泽龙 committed
241
        const dom = createPop(markerInfoWindow, {
耿迪迪's avatar
耿迪迪 committed
242
          title: "调压箱",
耿迪迪's avatar
耿迪迪 committed
243
          data: data,
纪泽龙's avatar
纪泽龙 committed
244
          map: map
耿迪迪's avatar
耿迪迪 committed
245 246 247
        });
        const html = dom.$el;
        dom.remove();
耿迪迪's avatar
耿迪迪 committed
248 249 250
        return html;
      }
      case DEVICE_TYPE.VALUEWELL: {
纪泽龙's avatar
纪泽龙 committed
251
        const dom = createPop(markerInfoWindow, {
耿迪迪's avatar
耿迪迪 committed
252
          title: "阀门井",
耿迪迪's avatar
耿迪迪 committed
253
          data: data,
纪泽龙's avatar
纪泽龙 committed
254
          map: map
耿迪迪's avatar
耿迪迪 committed
255 256 257
        });
        const html = dom.$el;
        dom.remove();
耿迪迪's avatar
耿迪迪 committed
258 259 260
        return html;
      }
      case DEVICE_TYPE.FLOWMETER: {
纪泽龙's avatar
纪泽龙 committed
261
        const dom = createPop(markerInfoWindow, {
耿迪迪's avatar
耿迪迪 committed
262
          title: "流量计",
耿迪迪's avatar
耿迪迪 committed
263
          data: data,
纪泽龙's avatar
纪泽龙 committed
264
          map: map
耿迪迪's avatar
耿迪迪 committed
265 266 267
        });
        const html = dom.$el;
        dom.remove();
耿迪迪's avatar
耿迪迪 committed
268 269
        return html;
      }
270
      case DEVICE_TYPE.PRESSUREGAGE: {
纪泽龙's avatar
纪泽龙 committed
271
        const dom = createPop(markerInfoWindow, {
272 273
          title: "压力表",
          data: data,
纪泽龙's avatar
纪泽龙 committed
274
          map: map
275 276 277 278 279
        });
        const html = dom.$el;
        dom.remove();
        return html;
      }
耿迪迪's avatar
耿迪迪 committed
280 281 282
    }
  }

耿迪迪's avatar
耿迪迪 committed
283 284 285 286 287
  /**
   * 删除marker
   * @param delType
   * @param deviceId
   */
纪泽龙's avatar
纪泽龙 committed
288 289 290 291 292 293 294
  deleteMarker(delType, deviceId) {
    if (
      DEVICE_TYPE.REGEULATORBOX == delType ||
      DEVICE_TYPE.VALUEWELL == delType ||
      DEVICE_TYPE.FLOWMETER == delType ||
      DEVICE_TYPE.PRESSUREGAGE == delType
    ) {
耿迪迪's avatar
耿迪迪 committed
295 296 297 298
      delDeviceInfo(deviceId);
    }
  }

耿迪迪's avatar
耿迪迪 committed
299 300 301 302
  /**
   * 设置设备图标
   * @param marker
   */
纪泽龙's avatar
纪泽龙 committed
303
  setMarkerIcon(marker) {
纪泽龙's avatar
纪泽龙 committed
304 305
    switch (this.markerType) {
      case DEVICE_TYPE.REGEULATORBOX: {
耿迪迪's avatar
耿迪迪 committed
306 307
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
308
          image: require("../assets/images/tiaoyaxiang.png")
耿迪迪's avatar
耿迪迪 committed
309 310 311
        });
        marker.setIcon(icon);
        break;
312
      }
纪泽龙's avatar
纪泽龙 committed
313
      case DEVICE_TYPE.VALUEWELL: {
耿迪迪's avatar
耿迪迪 committed
314 315
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
316
          image: require("../assets/images/famenjing.png")
耿迪迪's avatar
耿迪迪 committed
317 318 319
        });
        marker.setIcon(icon);
        break;
320
      }
纪泽龙's avatar
纪泽龙 committed
321
      case DEVICE_TYPE.FLOWMETER: {
耿迪迪's avatar
耿迪迪 committed
322 323
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
324
          image: require("../assets/images/liuliangji.png")
耿迪迪's avatar
耿迪迪 committed
325 326 327
        });
        marker.setIcon(icon);
        break;
328
      }
纪泽龙's avatar
纪泽龙 committed
329
      case DEVICE_TYPE.DUTYPERSON: {
耿迪迪's avatar
耿迪迪 committed
330 331
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
332
          image: require("../assets/images/zhibaorenyuan.png")
耿迪迪's avatar
耿迪迪 committed
333 334 335
        });
        marker.setIcon(icon);
        break;
336
      }
yaqizhang's avatar
yaqizhang committed
337 338 339
      case DEVICE_TYPE.WORKORDER: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
340
          image: require("../assets/images/zhibaorenyuan.png")
yaqizhang's avatar
yaqizhang committed
341 342 343 344
        });
        marker.setIcon(icon);
        break;
      }
345 346 347
      case DEVICE_TYPE.PRESSUREGAGE: {
        let icon = new AMap.Icon({
          //size: new AMap.Size(51, 23),
纪泽龙's avatar
纪泽龙 committed
348
          image: require("../assets/images/yalibiao.png")
349 350 351 352
        });
        marker.setIcon(icon);
        break;
      }
耿迪迪's avatar
耿迪迪 committed
353
    }
耿迪迪's avatar
耿迪迪 committed
354 355 356 357 358 359
  }

  /**
   * 添加折线
   * @param path
   */
纪泽龙's avatar
纪泽龙 committed
360
  addPolyline(arr) {
纪泽龙's avatar
纪泽龙 committed
361
    // this` polyLines = [];
纪泽龙's avatar
纪泽龙 committed
362 363 364 365 366 367 368 369 370
    console.log("包装的数组", arr);
    for (let i = 0; i < arr.length; i++) {
      const item = arr[i];
      let { coordinates } = item;
      // console.log("coordinates",coordinates)
      // let path = coordinates ? getArray(coordinates) :[];
      // 字符串转二维数组

      let path = coordinates ? eval(coordinates) : [];
耿迪迪's avatar
耿迪迪 committed
371
      let polyline = new AMap.Polyline({
纪泽龙's avatar
纪泽龙 committed
372
        path,
纪泽龙's avatar
纪泽龙 committed
373
        strokeColor: "#F7FE38",
耿迪迪's avatar
耿迪迪 committed
374 375 376 377
        strokeWeight: 8,
        strokeOpacity: 0.9,
        zIndex: 50,
        bubble: true,
纪泽龙's avatar
纪泽龙 committed
378 379 380 381
        geodesic: true,
        extData: {
          type: "line",
          //当前line状态 0:正常状态 1:正在编辑状态
纪泽龙's avatar
纪泽龙 committed
382 383
          isState: 0,
          lineData: item
纪泽龙's avatar
纪泽龙 committed
384 385
        }
      });
纪泽龙's avatar
纪泽龙 committed
386

纪泽龙's avatar
纪泽龙 committed
387 388
      this.polyLines.push(polyline);
      // 信息窗体
纪泽龙's avatar
纪泽龙 committed
389
      const dom = createPop(lineInfoWindow, {
纪泽龙's avatar
纪泽龙 committed
390
        obj: { a: 123, editorPage: true, ...item, polyline }
纪泽龙's avatar
纪泽龙 committed
391
      });
纪泽龙's avatar
纪泽龙 committed
392

纪泽龙's avatar
纪泽龙 committed
393
      console.log("dom", dom.$el);
纪泽龙's avatar
纪泽龙 committed
394 395 396 397 398 399 400 401 402 403
      dom.$el.addEventListener("mouseover", () => {
        let options = this.myMap.getStatus();
        options.scrollWheel = false;
        this.myMap.setStatus(options);
      });
      dom.$el.addEventListener("mouseout", () => {
        let options = this.myMap.getStatus();
        options.scrollWheel = true;
        this.myMap.setStatus(options);
      });
纪泽龙's avatar
纪泽龙 committed
404
      let infoWindow = new AMap.InfoWindow({
纪泽龙's avatar
纪泽龙 committed
405
        isCustom: true,
纪泽龙's avatar
纪泽龙 committed
406
        autoMove: false,
纪泽龙's avatar
纪泽龙 committed
407
        content: dom.$el,
纪泽龙's avatar
纪泽龙 committed
408
        //信息船体偏移量
纪泽龙's avatar
纪泽龙 committed
409
        offset: new AMap.Pixel(0, 0),
纪泽龙's avatar
纪泽龙 committed
410 411 412
        anchor: "left-top"
      });

纪泽龙's avatar
纪泽龙 committed
413
      this.newLineAddEvent(polyline);
纪泽龙's avatar
纪泽龙 committed
414
      polyline.infoWindow = infoWindow;
纪泽龙's avatar
纪泽龙 committed
415 416
      //添加事件
      polyline.on("mouseover", e => {
纪泽龙's avatar
纪泽龙 committed
417
        if (this.lineType == 1) return;
纪泽龙's avatar
纪泽龙 committed
418 419 420 421 422
        // 上方导航的高
        const topBar = 81;
        // 坐标导航的宽
        const leftBar = 100;
        // 屏幕可视区的宽高
纪泽龙's avatar
纪泽龙 committed
423 424 425 426
        const {
          clientWidth: windowClientWidth,
          clientHeight: windowClientHeight
        } = document.body;
纪泽龙's avatar
纪泽龙 committed
427
        // 弹出的信息窗口的宽高
纪泽龙's avatar
纪泽龙 committed
428

纪泽龙's avatar
纪泽龙 committed
429 430 431 432
        const {
          offsetWidth: infoWindowWidth,
          offsetHeight: infoWindowHeight
        } = { offsetWidth: 406, offsetHeight: 316 };
纪泽龙's avatar
纪泽龙 committed
433
        // 鼠标碰到线后的位置
纪泽龙's avatar
纪泽龙 committed
434
        const { clientX: mouseClientX, clientY: mouseClientY } = e.originEvent;
纪泽龙's avatar
纪泽龙 committed
435
        // 鼠标到左边界的距离
纪泽龙's avatar
纪泽龙 committed
436
        const offsetLeftX = mouseClientX - 100;
纪泽龙's avatar
纪泽龙 committed
437
        // 鼠标到右边界的距离
纪泽龙's avatar
纪泽龙 committed
438 439 440
        const offsetRightX = windowClientWidth - mouseClientX;
        const offsetTopY = mouseClientY - 81;
        const offsetBottomY = windowClientHeight - mouseClientY;
纪泽龙's avatar
纪泽龙 committed
441

纪泽龙's avatar
纪泽龙 committed
442 443 444 445 446 447 448 449 450
        const offsetY = mouseClientY - 80 - infoWindowHeight;
        let X = 20,
          Y = -20;
        if (offsetLeftX <= infoWindowWidth) {
          console.log("靠左了");
          X = 20;
        } else if (offsetRightX <= infoWindowWidth) {
          console.log("靠右了");
          X = -infoWindowWidth - 20;
纪泽龙's avatar
纪泽龙 committed
451
        }
纪泽龙's avatar
纪泽龙 committed
452 453 454 455 456 457
        if (offsetTopY <= infoWindowHeight) {
          console.log("靠上了");
          Y = 20;
        } else if (offsetBottomY <= infoWindowHeight + 81) {
          console.log("靠下了");
          Y = -infoWindowHeight - 20;
纪泽龙's avatar
纪泽龙 committed
458 459
        }
        polyline.setOptions({ strokeColor: "#FF5A67" });
纪泽龙's avatar
纪泽龙 committed
460
        infoWindow.setOffset(new AMap.Pixel(X, Y));
纪泽龙's avatar
纪泽龙 committed
461
        infoWindow.open(map, e.lnglat);
纪泽龙's avatar
纪泽龙 committed
462 463
        // polyline.infoWindow=infoWindow;
        this.showInfoWindow = infoWindow;
纪泽龙's avatar
纪泽龙 committed
464

纪泽龙's avatar
纪泽龙 committed
465
        // const
纪泽龙's avatar
纪泽龙 committed
466 467
      });
      polyline.on("mouseout", e => {
纪泽龙's avatar
纪泽龙 committed
468
        polyline.setOptions({ strokeColor: "#F7FE38" });
纪泽龙's avatar
纪泽龙 committed
469
        // infoWindow.close();
纪泽龙's avatar
纪泽龙 committed
470
      });
纪泽龙's avatar
纪泽龙 committed
471
      // 计算info的位置
纪泽龙's avatar
纪泽龙 committed
472
      // function infoPosition() {}
纪泽龙's avatar
纪泽龙 committed
473 474 475 476 477 478 479 480
    }
    map.add(this.polyLines);
    // 缩放地图到合适的视野级别
    // map.setFitView();
  }
  // 创建一条新的线
  createNewLine() {
    this.mouseTool.polyline({
纪泽龙's avatar
纪泽龙 committed
481
      // bubbles:false,
纪泽龙's avatar
纪泽龙 committed
482 483 484 485 486 487 488 489 490
      strokeWeight: 9,
      strokeColor: "#80d8ff",
      extData: {
        type: "newLine",
        //当前line状态 0:正常状态 1:正在编辑状态
        isState: 0
      }
      //同Polyline的Option设置
    });
纪泽龙's avatar
纪泽龙 committed
491 492
    // 让它不再等于null
    // this.newLineObj={a:123}
纪泽龙's avatar
纪泽龙 committed
493
  }
纪泽龙's avatar
纪泽龙 committed
494 495 496 497 498 499 500
  // 创建出来的新线归位,重置,当点击编辑跟删除的时候
  newLineReset() {
    this.lineFlag = false;
    if (this.mouserTool) {
      this.mouseTool.close();
    }
    if (this.newLineObj) {
纪泽龙's avatar
纪泽龙 committed
501
      this.newLineObj.polyEditor.close();
纪泽龙's avatar
纪泽龙 committed
502
      map.remove(this.newLineObj);
纪泽龙's avatar
纪泽龙 committed
503
      this.newLineObj = null;
纪泽龙's avatar
纪泽龙 committed
504 505
    }
  }
纪泽龙's avatar
纪泽龙 committed
506
  // 新建line增加编辑以及右键菜单
纪泽龙's avatar
纪泽龙 committed
507 508
  closeLineInfoWindow() {
    this.showInfoWindow && this.showInfoWindow.close();
纪泽龙's avatar
纪泽龙 committed
509 510 511 512
  }
  // 新line与老line添加点击事件
  newLineAddEvent(obj) {
    obj.polyEditor = new AMap.PolyEditor(map, obj);
纪泽龙's avatar
纪泽龙 committed
513 514 515 516 517
    // obj.polyEditor.on('adjust',(e)=>{
    //   console.log("addnode")
    // })
    obj.on("mousedown", e => {
      console.log(e.originEvent);
纪泽龙's avatar
纪泽龙 committed
518
      console.log("lineType", this.lineType);
纪泽龙's avatar
纪泽龙 committed
519 520
      this.lineFlag = true;
      // 每次点击关闭然后再次激活
纪泽龙's avatar
纪泽龙 committed
521 522 523 524
      // 如果是新线就关闭
      if (obj.getExtData().type == "newLine") {
        this.mouseTool.close();
      }
纪泽龙's avatar
纪泽龙 committed
525 526 527 528 529
      // 删除
      if (this.lineType == 3) {
        this.lineDelete(obj);
        return;
      }
纪泽龙's avatar
纪泽龙 committed
530
      // 获取当前状态 0普通状态,1是正编辑状态
纪泽龙's avatar
纪泽龙 committed
531
      const { isState, type } = obj.getExtData();
纪泽龙's avatar
纪泽龙 committed
532
      // 如果不是新线的时候并且没点编辑,点击是无效的
纪泽龙's avatar
纪泽龙 committed
533
      if (type != "newLine" && this.lineType != 2) return;
纪泽龙's avatar
纪泽龙 committed
534 535 536 537 538 539 540 541
      if (isState == 0) {
        // 如果是0,就打开编辑,变成编辑状态
        obj.polyEditor.open();
        let opstions = obj.getExtData();
        opstions.isState = 1;
        console.log(opstions);
        obj.setExtData(opstions);
      } else {
纪泽龙's avatar
纪泽龙 committed
542
        // 经纬度
纪泽龙's avatar
纪泽龙 committed
543
        const lnglatsArr = obj.getPath().map(item => [item.lng, item.lat]);
纪泽龙's avatar
纪泽龙 committed
544 545 546 547
        // 管道总长度
        const pipeLength = obj.getLength();
        // 传回来的数据 如果是新管道就是空
        const lineData = type == "newLine" ? {} : obj.getExtData().lineData;
纪泽龙's avatar
纪泽龙 committed
548 549 550 551 552 553 554 555
        console.log("lineData===================>传入组件的数据", lineData);
        this.infoWindowPipelineView({
          target: obj,
          lineType: type,
          lnglatsArr,
          pipeLength,
          lineData
        });
纪泽龙's avatar
纪泽龙 committed
556 557 558
      }
    });
  }
纪泽龙's avatar
纪泽龙 committed
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
  // 隐藏所有管道
  lineShow(bool) {
    bool
      ? this.polyLines.forEach(item => item.show())
      : this.polyLines.forEach(item => item.hide());
    if (this.newLineObj) {
      bool ? this.newLineObj.show() : this.newLineObj.hide();
    }
  }
  markerShow(type, bool) {
    this.markers.forEach(item => {
      const { deviceType } = item.getExtData();
      if (deviceType == type) {
        bool ? item.show() : item.hide();
      }
      // console.log("deviceType",deviceType);
    });
  }
纪泽龙's avatar
纪泽龙 committed
577
  lineDelete(obj) {
纪泽龙's avatar
纪泽龙 committed
578 579 580
    const {
      lineData: { pipeName }
    } = obj.getExtData();
纪泽龙's avatar
纪泽龙 committed
581
    vue
纪泽龙's avatar
纪泽龙 committed
582
      .$confirm(`是否删除${pipeName}`, "提示", {
纪泽龙's avatar
纪泽龙 committed
583 584
        // confirmButtonText: "确定",
        // cancelButtonText: "取消",
纪泽龙's avatar
纪泽龙 committed
585
        type: "warning"
纪泽龙's avatar
纪泽龙 committed
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
        // center: true
      })
      .then(() => {
        const {
          lineData: { pipeId }
        } = obj.getExtData();
        console.log(pipeId);
        delPipe(pipeId).then(res => {
          const index = this.polyLines.indexOf(obj);
          // 如果是老线,就要线删除原来的,然后重新包装一遍
          if (index >= 0) {
            this.polyLines.splice(index, 1);
            map.remove(obj);
          }
          vue.$message({
            type: "success",
纪泽龙's avatar
纪泽龙 committed
602 603
            offset: 100,
            // center:true,
纪泽龙's avatar
纪泽龙 committed
604 605
            message: "删除成功!"
          });
纪泽龙's avatar
纪泽龙 committed
606 607
          // 关闭当前线条的infowindow
          // this.closeLineInfoWindow();
纪泽龙's avatar
纪泽龙 committed
608 609 610 611 612
        });
      })
      .catch(() => {
        vue.$message({
          type: "info",
纪泽龙's avatar
纪泽龙 committed
613 614
          // center:true,
          offset: 100,
纪泽龙's avatar
纪泽龙 committed
615 616 617 618
          message: "已取消删除"
        });
      });
  }
纪泽龙's avatar
纪泽龙 committed
619 620 621 622
  // 关闭所有已经上传的线的编辑状态
  linePolyEditorAllClose() {
    this.polyLines.forEach(item => {
      item.polyEditor.close();
纪泽龙's avatar
纪泽龙 committed
623 624 625 626 627 628 629
      let opstions = item.getExtData();
      opstions.isState = 0;
      item.setExtData(opstions);

      let attr = item.getOptions();
      attr.strokeColor = "#F7FE38";
      item.setOptions(attr);
纪泽龙's avatar
纪泽龙 committed
630 631 632
    });
  }

纪泽龙's avatar
纪泽龙 committed
633
  // 传进组件的会调 点确认的时候调
纪泽龙's avatar
纪泽龙 committed
634
  lineOkCallBack(target, data) {
纪泽龙's avatar
纪泽龙 committed
635 636 637
    target.polyEditor.close();
    const index = this.polyLines.indexOf(target);
    // 如果是老线,就要线删除原来的,然后重新包装一遍
纪泽龙's avatar
纪泽龙 committed
638 639
    if (index >= 0) {
      this.polyLines.splice(index, 1);
耿迪迪's avatar
耿迪迪 committed
640
    }
纪泽龙's avatar
纪泽龙 committed
641 642
    console.log("data999-=================>传回来的data", data);
    this.addPolyline([data]);
纪泽龙's avatar
纪泽龙 committed
643 644
    map.remove(target);
    // console.log('polyLines',this.polyLines)
耿迪迪's avatar
耿迪迪 committed
645
  }
纪泽龙's avatar
纪泽龙 committed
646
  // 上传服务器用的组件
耿迪迪's avatar
耿迪迪 committed
647

纪泽龙's avatar
纪泽龙 committed
648
  infoWindowPipelineView(options) {
纪泽龙's avatar
纪泽龙 committed
649
    // const {} =options;
纪泽龙's avatar
纪泽龙 committed
650 651
    const notice = createPop(pipelineView, {
      title: "管道",
纪泽龙's avatar
纪泽龙 committed
652 653 654 655 656 657 658 659
      // 数据
      // lineData: options.lineData,
      // lnglatsArr:options.lnglatsArr,
      // pipeLength:options.pipeLength,
      // //线是新线还是老线
      // lineType: options.lineType,
      // target: options.obj,
      ...options,
纪泽龙's avatar
纪泽龙 committed
660
      //把当前对象当作that传进去
纪泽龙's avatar
纪泽龙 committed
661 662
      gaodeMap: this,
      lineOkCallBack: this.lineOkCallBack
纪泽龙's avatar
纪泽龙 committed
663 664 665
    });
    notice.show();
  }
耿迪迪's avatar
耿迪迪 committed
666 667 668
  /**
   * 添加鼠标事件
   */
纪泽龙's avatar
纪泽龙 committed
669
  addMouseTool() {
耿迪迪's avatar
耿迪迪 committed
670
    this.mouseTool = new AMap.MouseTool(map);
耿迪迪's avatar
耿迪迪 committed
671
    //监听draw事件可获取画好的覆盖物
耿迪迪's avatar
耿迪迪 committed
672 673
    this.overlays = [];
    let that = this;
耿迪迪's avatar
耿迪迪 committed
674
    this.markerOverlays = [];
纪泽龙's avatar
纪泽龙 committed
675 676
    this.mouseTool.on("draw", function(e) {
      if (e.obj.getExtData().type != "newLine") {
耿迪迪's avatar
耿迪迪 committed
677
        map.remove(that.markerOverlays);
纪泽龙's avatar
纪泽龙 committed
678
        const device = that.createInfowindow();
耿迪迪's avatar
耿迪迪 committed
679 680 681
        device.map = map;
        device.obj = e.obj;
        device.gaoMap = that;
纪泽龙's avatar
纪泽龙 committed
682
        e.obj.on("click", function(aa) {
纪泽龙's avatar
纪泽龙 committed
683
          let postion = aa.target._position;
684
          //兼容拖拽后单击事件,拖拽后点击事件返回位置为数组
纪泽龙's avatar
纪泽龙 committed
685
          if (postion instanceof Array) {
686 687
            device.form.longitude = postion[0];
            device.form.latitude = postion[1];
纪泽龙's avatar
纪泽龙 committed
688
          } else {
689 690 691 692
            device.form.longitude = postion.lng;
            device.form.latitude = postion.lat;
          }

纪泽龙's avatar
纪泽龙 committed
693
          device.show();
纪泽龙's avatar
纪泽龙 committed
694
        });
耿迪迪's avatar
耿迪迪 committed
695
        that.markerOverlays.push(e.obj);
纪泽龙's avatar
纪泽龙 committed
696 697
      }

纪泽龙's avatar
纪泽龙 committed
698 699
      if (e.obj && e.obj.getExtData().type == "newLine") {
        console.log("挂上事件");
纪泽龙's avatar
纪泽龙 committed
700
        that.newLineAddEvent(e.obj);
纪泽龙's avatar
纪泽龙 committed
701 702
        // 记录这条线
        that.newLineObj = e.obj;
纪泽龙's avatar
纪泽龙 committed
703 704
        // 关闭
        that.mouseTool.close();
纪泽龙's avatar
纪泽龙 committed
705 706 707
        // 创建一条新线,然后在点地图的时候删除原来的旧线
        // that.createNewLine();

纪泽龙's avatar
纪泽龙 committed
708 709 710
        // 右键菜单
        // that.addEditorAndMenu(e.obj)
      }
耿迪迪's avatar
耿迪迪 committed
711

纪泽龙's avatar
纪泽龙 committed
712 713 714
      // if(e.obj.getExtData().type=="line"){
      //   return;
      // }
耿迪迪's avatar
耿迪迪 committed
715
      //that.mouseTool.close();
纪泽龙's avatar
纪泽龙 committed
716
      that.overlays.push(e.obj);
耿迪迪's avatar
耿迪迪 committed
717
    });
耿迪迪's avatar
耿迪迪 committed
718
  }
耿迪迪's avatar
耿迪迪 committed
719

720 721 722
  /**
   * 创建弹框事件
   */
纪泽龙's avatar
纪泽龙 committed
723 724 725
  createInfowindow() {
    switch (this.deviceType) {
      case DEVICE_TYPE.PIPEPLINE: {
726 727
        break;
      }
纪泽龙's avatar
纪泽龙 committed
728
      case DEVICE_TYPE.REGEULATORBOX: {
729
        return createPop(regulatorBox, {
纪泽龙's avatar
纪泽龙 committed
730
          title: "调压箱"
731 732
        });
      }
纪泽龙's avatar
纪泽龙 committed
733
      case DEVICE_TYPE.VALUEWELL: {
734
        return createPop(valveWell, {
纪泽龙's avatar
纪泽龙 committed
735
          title: "阀门井"
736 737
        });
      }
纪泽龙's avatar
纪泽龙 committed
738
      case DEVICE_TYPE.FLOWMETER: {
739
        return createPop(flowMeter, {
纪泽龙's avatar
纪泽龙 committed
740
          title: "流量计"
741 742
        });
      }
743 744 745 746 747
      case DEVICE_TYPE.PRESSUREGAGE: {
        return createPop(flowMeter, {
          title: "压力表"
        });
      }
748
    }
耿迪迪's avatar
耿迪迪 committed
749
  }
耿迪迪's avatar
耿迪迪 committed
750

751 752 753 754
  /**
   * 鼠标画图事件
   * @param deviceType 设备类型
   */
纪泽龙's avatar
纪泽龙 committed
755
  draw(deviceType) {
耿迪迪's avatar
耿迪迪 committed
756
    let that = this;
757
    that.deviceType = deviceType;
纪泽龙's avatar
纪泽龙 committed
758 759 760
    if (
      DEVICE_TYPE.REGEULATORBOX == deviceType ||
      DEVICE_TYPE.VALUEWELL == deviceType ||
761 762
      DEVICE_TYPE.FLOWMETER == deviceType ||
      DEVICE_TYPE.PRESSUREGAGE == deviceType
纪泽龙's avatar
纪泽龙 committed
763
    ) {
764 765 766 767
      that.mouseTool.marker({
        draggable: true
      });
    }
纪泽龙's avatar
纪泽龙 committed
768
    if (DEVICE_TYPE.PIPEPLINE == deviceType) {
769 770
      that.mouseTool.polyline({
        strokeWeight: 9,
纪泽龙's avatar
纪泽龙 committed
771
        strokeColor: "#80d8ff"
772 773 774
        //同Polyline的Option设置
      });
    }
耿迪迪's avatar
耿迪迪 committed
775 776
  }

耿迪迪's avatar
耿迪迪 committed
777 778 779
  /**
   * 添加地图控件
   */
纪泽龙's avatar
纪泽龙 committed
780 781 782 783 784 785 786 787 788 789 790 791
  addMapControl() {
    AMap.plugin(
      [
        "AMap.ToolBar",
        "AMap.Scale",
        "AMap.HawkEye",
        "AMap.MapType",
        "AMap.Geolocation"
      ],
      function() {
        // 在图面添加工具条控件,工具条控件集成了缩放、平移、定位等功能按钮在内的组合控件
        //map.addControl(new AMap.ToolBar());
耿迪迪's avatar
耿迪迪 committed
792

纪泽龙's avatar
纪泽龙 committed
793 794
        // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
        map.addControl(new AMap.Scale());
耿迪迪's avatar
耿迪迪 committed
795

纪泽龙's avatar
纪泽龙 committed
796 797
        // 在图面添加鹰眼控件,在地图右下角显示地图的缩略图
        map.addControl(new AMap.HawkEye({ isOpen: true }));
耿迪迪's avatar
耿迪迪 committed
798

纪泽龙's avatar
纪泽龙 committed
799 800 801 802
        // 在图面添加类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制
        map.addControl(
          new AMap.MapType({ position: { top: "10px", left: "100px" } })
        );
耿迪迪's avatar
耿迪迪 committed
803

纪泽龙's avatar
纪泽龙 committed
804 805 806 807
        // 在图面添加定位控件,用来获取和展示用户主机所在的经纬度位置
        // map.addControl(new AMap.Geolocation());
      }
    );
耿迪迪's avatar
耿迪迪 committed
808
  }
809

纪泽龙's avatar
纪泽龙 committed
810
  searchTips(inputId) {
811
    let that = this;
纪泽龙's avatar
纪泽龙 committed
812
    AMap.plugin(["AMap.AutoComplete", "AMap.PlaceSearch"], function() {
813 814 815 816
      //输入提示
      var autoOptions = {
        input: inputId
      };
耿迪迪's avatar
耿迪迪 committed
817
      let auto = new AMap.AutoComplete(autoOptions);
818 819 820 821
      that.placeSearch = new AMap.PlaceSearch({
        map: map
      });
      //构造地点查询类
纪泽龙's avatar
纪泽龙 committed
822
      auto.on("select", function(e) {
耿迪迪's avatar
耿迪迪 committed
823 824
        that.searchSelectAdcode = e.poi.adcode;
        that.searchSelectName = e.poi.name;
纪泽龙's avatar
纪泽龙 committed
825 826
      });
    });
827 828
  }

耿迪迪's avatar
耿迪迪 committed
829

纪泽龙's avatar
纪泽龙 committed
830
  closeAddMarker() {
耿迪迪's avatar
耿迪迪 committed
831 832 833
    this.mouseTool.close();
    map.remove(this.markerOverlays);
  }
耿迪迪's avatar
耿迪迪 committed
834 835
}
export default gaodeMap;