maptalks多边形区域和点位-vue组件

news2025/1/17 5:58:52

多边形

<!-- 地图组件 -->
<template>
  <div :id="id" class="container"></div>
</template>

<script>
import _ from "lodash";
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
  //import引入的组件需要注入到对象中才能使用
  name: "Map",
  props: {
    id: {
      type: String,
      default: () => {
        return "map";
      },
    },
    mapSet: {
      type: Object,
      default: () => {
        return {};
      },
    },
    color: {
      type: String,
      default: () => {
        return "";
      },
    },
  },
  components: {},
  data() {
    //这里存放数据
    return {
      dataLis: [],
      layer: null,
      layer2: null,
      map: null,
      polygon: null,
      drawTool: null,
      // 默认中心点点位
      center: [121.044372, 30.575405],
      // 缩放层级
      zoom: 14,
      // 倾斜度
      pitch: 0,
      // 轴承
      // bearing: 90,
      // 最小缩放层级
      minZoom: 1,
      // 最大缩放层级
      maxZoom: 18.5,
      symbol: {
        polygonFill: "#ff0000", // 图形覆盖颜色
        polygonOpacity: 0.3, // 图形覆盖区域透明度
        lineColor: "#ff0000", // 线条颜色
        lineWidth: 2, // 线条宽度
      },
      pointSymbol: {
        markerFile: "@/assets/logo/logo.png",
        markerWidth: 20,
        markerHeight: 20,
      },
      layerSwitcherControl: {
        position: "top-right",
        // title of base layers
        baseTitle: "地图类型",
        // title of layers
        overlayTitle: "图层",
        // layers you don't want to manage with layer switcher
        excludeLayers: [],
        // css class of container element, maptalks-layer-switcher by default
        containerClass: "maptalks-layer-switcher",
      },
      // 电子地图图层
      // urlTemplate: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
      // subdomains: ["a", "b", "c", "d"],
      // attribution:
      //   '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
      // urlTemplate:
      //   "https://gss{s}.bdstatic.com/8bo_dTSlRsgBo1vgoIiO_jowehsv/tile/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&udt=20170927",
      // subdomains: [0, 1, 2, 3],
      // attribution:
      //   '&copy; <a target="_blank" href="http://map.baidu.com">Baidu</a>'
      drawMap: {
        Point: "点",
        LineString: "线",
        Polygon: "多边形",
        Circle: "圆",
        Ellipse: "椭圆",
        Rectangle: "长方形",
      },
    };
  },
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {
    mapSet: {
      deep: true,
      immediate: true,
      async handler(val) {
        if (Object.keys(val).length) {
          let { drawMapType, drawMapArray, editable, draggable } = val;
          if (this.map != undefined) this.map.remove();
          await this.init();
          //  循环插入多边形
          if (drawMapArray && drawMapArray.length > 0) {
            // console.log("回显", editable);
            drawMapArray.forEach(item => {
              let obj = {
                // 编辑图形
                drawMapArray: () => {
                  this.startEdit(item, {
                    drawMapType,
                    editable,
                    draggable,
                    drawMapArray: item
                  });
                },
                // 绘制图形
                drawMapType: () => {
                  this.drawMapType({
                    drawMapType,
                    editable,
                    draggable,
                    drawMapArray: item
                  });
                },
              };
              let arrayKeys = Object.keys({
                drawMapType,
                editable,
                draggable,
                drawMapArray: item
              });
              arrayKeys.map((item) => {
                if (obj[item]) return obj[item]();
              });
            })
            if (editable) {
              // 打开新增多边形
              let obj = {
                // 绘制图形
                drawMapType: () => {
                  this.drawMapType({
                    drawMapType,
                    editable,
                    draggable,
                    // drawMapArray
                  });
                },
              };
              let arrayKeys = Object.keys({
                drawMapType,
                editable,
                draggable,
                // drawMapArray
              });
              arrayKeys.map((item) => {
                if (obj[item]) return obj[item]();
              });
            }
          } else {
            // console.log("新增");
            let obj = {
              // 绘制图形
              drawMapType: () => {
                this.drawMapType({
                  drawMapType,
                  editable,
                  draggable,
                  // drawMapArray
                });
              },
            };
            let arrayKeys = Object.keys({
              drawMapType,
              editable,
              draggable,
              // drawMapArray
            });
            arrayKeys.map((item) => {
              if (obj[item]) return obj[item]();
            });
          }
        } else {
          // console.log("销毁地图");
          if (this.map != undefined) this.map.remove();
        }
      },
    },
    color: {
      immediate: true,
      handler(val) {
        // console.log("🚀 ~ Date:2023/06/15 17:14 ~ File: index.vue ~ Line:118 ----- ", val);
        if (val) {
          let { drawTool, polygon } = this;
          if (drawTool) this.changeSymbol("drawTool", drawTool, val);
          if (polygon) this.changeSymbol("polygon", polygon, val);
          // if (drawTool) {
          //   drawTool.setSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     polygonOpacity: 0.3, // 图形覆盖区域透明度
          //     lineColor: val, // 线条颜色
          //     lineWidth: 2 // 线条宽度
          //   });
          // }
          // if (polygon) {
          //   polygon.updateSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     lineColor: val // 线条颜色
          //   });
          // }
        }
      },
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  // created() { },
  //生命周期 - 挂载完成(可以访问DOM元素)
  // mounted() {
  // let a = "rgb(255, 69, 0)";
  // console.log(a.slice(5, a.length - 1));
  // },
  // beforeDestroy() {
  //   let { map } = this;
  //   // console.log(
  //   //   "🚀 ~ Date:2023/07/11 14:37 ~ File: index.vue ~ Line:154 ----- ",
  //   //   销毁地图
  //   // );
  //   if (map) map.remove();
  // },
  //方法集合
  methods: {
    // 获取到图层所有的点位
    getSent(data) {
      let array = []
      data.forEach(res => {
        let arrray2 = []
        res._coordinates.forEach(res2 => {
          arrray2.push({
            "lngWgs": res2.x,
            "latWgs": res2.y,
            // "sort": index2
          })
        })
        array.push(arrray2)
      })
      return array;
    },
    init() {
      this.$nextTick(() => {
        let { center, zoom, pitch, minZoom, maxZoom, symbol, layerSwitcherControl, id } = this;
        this.map = new maptalks.Map(id, {
          center,
          zoom,
          pitch,
          minZoom,
          maxZoom,
          centerCross: true,
          seamlessZoom: true,
          attribution: false,
          zoomControl: true, // add zoom control
          scaleControl: true, // add scale control
          layerSwitcherControl,
          symbol,
          // baseLayer 表示基础图层,它可以添加多个,逗号隔开
          baseLayer: new maptalks.GroupTileLayer("Base TileLayer", [
            new maptalks.TileLayer("卫星图", {
              urlTemplate:
                "https://t5.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk=074d4a21c8f34a3a20cd1f69f81b26bf",
              subdomains: ["a", "b", "c", "d"],
            }),
            new maptalks.TileLayer("二维图", {
              visible: false,
              // urlTemplate:
              //   "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
              urlTemplate:
                "https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
              subdomains: ["a", "b", "c", "d"],
            }),

            // new maptalks.TileLayer("Carto dark", {
            //   visible: false,
            //   urlTemplate:
            //     "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
            //   subdomains: ["a", "b", "c", "d"],
            // }),
            // new maptalks.WMSTileLayer("survey", {
            //   urlTemplate: "http://10.169.61.30:8080/geoserver/gwc/service/wms",
            //   crs: "EPSG:3857",
            //   layers: "haigang",
            //   styles: "",
            //   version: "1.1.1",
            //   tileStackDepth: 0,
            //   format: "image/png",
            //   transparent: true,
            //   uppercase: true,
            //   zIndex: 1,
            //   forceRenderOnMoving: true,
            //   forceRenderOnZooming: true,
            // }),
          ]),
        });

        // 添加-地图矢量数据图层
        var tiandituLayer = new maptalks.TileLayer('tianditu', {
          urlTemplate: 'http://t0.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=074d4a21c8f34a3a20cd1f69f81b26bf',
          subdomains: ['a', 'b', 'c']
        });
        this.map.addLayer(tiandituLayer);

        // 监听图层切换监听
        this.map.getBaseLayer().on('layerload', function (e) {
          let visible = e.target.layers[0].options.visible
          if (visible) {
            // console.log("卫星图", this.map._layers[0].options.visible);
            this.map._layers[0].options.visible = true  // 显示-矢量数据图层 
          } else {
            // console.log("二维图", this.map._layers);
            this.map._layers[0].options.visible = false  // 隐藏-矢量数据图层
          }
        });

        // this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer2 = new maptalks.VectorLayer("vector2").addTo(this.map)
        // this.map.on("click", function (params) {
        //   console.log(666, params);
        // });
        this.map.on("editrecord", function (params) {
          console.log(params);
        });
      });
    },
    // 绘制图形
    drawMapType(val) {
      !this.layer ? this.layer = new maptalks.VectorLayer("vector").addTo(this.map) : null
      // console.log('绘制图形', val, this.map);
      let { drawMapType, drawMapArray } = val;
      if (!drawMapArray) {
        let { map, symbol, color } = this;
        let that = this;
        // var layer = new maptalks.VectorLayer("vector").addTo(map);
        var drawTool = new maptalks.DrawTool({
          mode: drawMapType,
          // once: true,
          // once: false,
          symbol: drawMapType == "Point" ? null : symbol,
        })
          .addTo(map)
          .disable();
        drawTool.on("drawend", function (param) {
          // console.log(param.geometry);
          let { _coordinates } = param.geometry;
          let array = null;
          if (drawMapType == "Point") {
            array = [_coordinates.x, _coordinates.y];
          } else if (drawMapType == "Polygon") {
            array = _coordinates.map((item) => {
              return [item.x, item.y];
            });
          }
          that.dataLis.push(array)
          // console.log(123, array);
          that.layer.addGeometry(param.geometry);
          that.startEdit(array, val, that.dataLis.length - 1);
          that.layer.remove();
          that.layer.setZIndex(6);
          that.$nextTick(() => {
            // console.log("绘制好了 发送", that.getSent(that.layer2._geoList));
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          })
        });
        this.drawTool = drawTool;
        drawTool.setMode(drawMapType).enable();
        // 改变覆盖物设置
        if (color) this.changeSymbol("drawTool", drawTool, color);
        // if (color) {
        //   drawTool.setSymbol({
        //     polygonFill: color, // 图形覆盖颜色
        //     polygonOpacity: 0.3, // 图形覆盖区域透明度
        //     lineColor: color, // 线条颜色
        //     lineWidth: 2 // 线条宽度
        //   });
        // }
      }
    },

    // 编辑绘制图形
    startEdit(array, val) {
      // let nun = Math.random();
      // console.log("编辑绘制图形", array, val);
      let that = this;
      let { drawMapType, editable, draggable } = val;
      let { symbol, map, pointSymbol, color } = that;
      let type = null;
      let pointArray = _.clone(array);
      // that.$emit("drawPointChange", pointArray);
      let objArray = [
        [() => drawMapType == "Polygon", () => {
          type = "Polygon"
        },
        () => {
          polygon.startEdit();
          // 更改形状
          polygon.on("shapechange", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              return [item.x, item.y];
            });
            // 更新原始多边形对象的位置
            param.target.getCoordinates()
            // polygon.setCoordinates(_coordinates);
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
            // console.log(111, that.getSent(that.layer2._geoList));
          });

          // 更改位置 
          polygon.on("positionchange", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              return [item.x, item.y];
            });
            // 更新原始多边形对象的位置 
            param.target.getCoordinates()
            // polygon.setCoordinates(_coordinates);
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
            // console.log(222);
            // console.log("send", that.getSent(that.layer2._geoList));
          });

          // 监听删除
          polygon.on("remove", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              return [item.x, item.y];
            });
            // 更新原始多边形对象的位置
            param.target.getCoordinates()
            // polygon.setCoordinates(_coordinates);
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
            // console.log(333);
          });
          // 监听右键点击事件
          // polygon.on("contextmenu", function (e) {
          //   console.log(112233, e);
          //   // 判断点击的是否为多边形
          //   if (e.target instanceof maptalks.Polygon) {
          //     // 删除多边形
          //     map.removeGeometry(e.target);
          //   }
          // });
        },
        ],
      ];
      let state = objArray.find((m) => m[0]());
      if (state) state[1]();
      let polygon = new maptalks[type](array, {
        visible: true,
        editable,
        cursor: "pointer",
        draggable,
        dragShadow: false,
        drawOnAxis: null,
        symbol,
      });

      let options = {
        'items': [
          {
            item: '删除', click: function (e) {
              that.layer2.removeGeometry(polygon);

            }
          }
        ]
      };
      polygon.setMenu(options).openMenu();
      // new maptalks.VectorLayer("vectorEdit" + nun, polygon).addTo(map);

      that.layer2.addGeometry(polygon);
      // that.layer.addGeometry(polygon);
      map.fitExtent(polygon.getExtent(), -1); // 自动适配区域 
      if (color) this.changeSymbol("polygon", polygon, color);
      if (state) state[2]();
      that.polygon = polygon;
    },

    // 覆盖物设置更改
    changeSymbol(type, mapObj, color) {
      let obj = {
        drawTool: () => {
          mapObj.setSymbol({
            polygonFill: color, // 图形覆盖颜色
            polygonOpacity: 0.3, // 图形覆盖区域透明度
            lineColor: color, // 线条颜色
            lineWidth: 2, // 线条宽度
          });
        },
        polygon: () => {
          mapObj.updateSymbol({
            polygonFill: color, // 图形覆盖颜色
            lineColor: color, // 线条颜色
          });
        },
      };
      if (obj[type]) return obj[type]();
    },
    // 绘制多边形
    // addPoint(val) {
    //   // console.log(this.map,66);
    //   let layer = new maptalks.VectorLayer("vector").addTo(this.map);
    //   // console.log(layer,"tu");
    //   val.forEach((item) => {
    //     let polygon = new maptalks.Polygon(item, {
    //       visible: true,
    //       editable: false,
    //       cursor: "pointer",
    //       draggable: false,
    //       dragShadow: false,
    //       drawOnAxis: null,
    //       // properties: {
    //       //   name,
    //       // },
    //       symbol: [
    //         {
    //           lineColor: "skyblue",
    //           lineWidth: 1,
    //           polygonFill: "skyblue",
    //           polygonOpacity: 0.1,
    //         },
    //       ],
    //     }).addTo(layer);
    //     //  polygon.setZIndex(0)
    //     layer.setZIndex(1);
    //   });
    // },

    // 绘制2dmark
    // addMark(val) {
    //   console.log(val, 6677);
    //   this.layer = new maptalks.VectorLayer("vector2").addTo(this.map);
    //   val.forEach((item) => {
    //     let sort = item.sort;
    //     let file = require("@/assets/warehouseWeb/equipment/001.png");

    //     let marker = new maptalks.Marker(item.list, {
    //       properties: {
    //         sort,
    //       },
    //       symbol: [
    //         {
    //           markerType: "path",
    //           markerFile: file,
    //           markerWidth: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerHeight: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerDx: 0,
    //           markerDy: 20,
    //           markerOpacity: 1,
    //         },
    //         {
    //           textFaceName: "sans-serif",
    //           textName: "{sort}",
    //           textSize: 12,
    //           textDy: 30,
    //           textFill: "#7ee6ed",
    //         },
    //       ],
    //     });
    //     this.layer.addGeometry(marker);
    //   });
    // },
    // 绘制3dmark
    // addMark3d(val) {
    //   console.log(val, 6677);
    //   this.layer2 = new maptalks.VectorLayer("vector3").addTo(this.map);
    //   val.forEach((item) => {
    //     let sort = item.sort;
    //     let file = require("@/assets/warehouseWeb/equipment/001.png");

    //     let marker = new maptalks.Marker(item.list, {
    //       properties: {
    //         sort,
    //       },
    //       symbol: [
    //         {
    //           markerType: "path",
    //           markerFile: file,
    //           markerWidth: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerHeight: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerDx: 0,
    //           markerDy: 20,
    //           markerOpacity: 1,
    //         },
    //         {
    //           textFaceName: "sans-serif",
    //           textName: "{sort}",
    //           textSize: 12,
    //           textDy: 30,
    //           textFill: "#7ee6ed",
    //         },
    //       ],
    //     });
    //     this.layer2.addGeometry(marker);
    //   });
    // },
  },
};
</script>
<style scoped>
.container {
  width: calc(100% - 50px);
  /* width: 550px; */
  min-height: 550px;
  margin: 15px;
}

/deep/ .maptalks-layer-switcher .panel .group:nth-child(2) {
  display: none !important;
}

/deep/ .maptalks-layer-switcher .panel {
  padding: 15px 0;
}
</style>

点位 

<!-- 地图组件 -->
<template>
  <div :id="id" class="container"></div>
</template>

<script>
import _ from "lodash";
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
  //import引入的组件需要注入到对象中才能使用
  name: "Map",
  props: {
    id: {
      type: String,
      default: () => {
        return "map";
      },
    },
    mapSet: {
      type: Object,
      default: () => {
        return {};
      },
    },
    color: {
      type: String,
      default: () => {
        return "";
      },
    },
  },
  components: {},
  data() {
    //这里存放数据
    return {
      dataLis: [],
      layer: null,
      layer2: null,
      map: null,
      polygon: null,
      drawTool: null,
      // 默认中心点点位
      center: [121.044372, 30.575405],
      // 缩放层级
      zoom: 14,
      // 倾斜度
      pitch: 0,
      // 轴承
      // bearing: 90,
      // 最小缩放层级
      minZoom: 1,
      // 最大缩放层级
      maxZoom: 18.5,
      symbol: {
        polygonFill: "#ff0000", // 图形覆盖颜色
        polygonOpacity: 0.3, // 图形覆盖区域透明度
        lineColor: "#ff0000", // 线条颜色
        lineWidth: 2, // 线条宽度
      },
      pointSymbol: {
        markerFile: "@/assets/logo/logo.png",
        markerWidth: 20,
        markerHeight: 20,
      },
      layerSwitcherControl: {
        position: "top-right",
        // title of base layers
        baseTitle: "地图类型",
        // title of layers
        overlayTitle: "Layers",
        // layers you don't want to manage with layer switcher
        excludeLayers: [],
        // css class of container element, maptalks-layer-switcher by default
        containerClass: "maptalks-layer-switcher",
      },
      drawMap: {
        Point: "点",
        LineString: "线",
        Polygon: "多边形",
        Circle: "圆",
        Ellipse: "椭圆",
        Rectangle: "长方形",
      },
    };
  },
  //监听属性 类似于data概念
  // computed: {},
  //监控data中的数据变化
  watch: {
    mapSet: {
      deep: true,
      immediate: true,
      async handler(val) {
        if (Object.keys(val).length) {
          let { drawMapType, drawMapArray, editable, draggable } = val;
          if (this.map) this.map.remove();
          await this.init();
          if (drawMapArray && drawMapArray.length > 0) {
            // console.log("地图获取到所有点位", drawMapArray);
            drawMapArray.map(i => {
              // console.log(123, i[0]);
              let items = i[0]
              let obj = {
                drawMapArray: () => {
                  this.startEdit(items, {
                    drawMapType, //点位
                    editable: true,//可编辑的
                    draggable: true, //拖动
                    drawMapArray: items  //数据
                  });
                },
                drawMapType: () => {
                  this.drawMapType({
                    drawMapType, //点位
                    editable: true,//可编辑的
                    draggable: true, //拖动
                    drawMapArray: items  //数据
                  });
                },
              };
              let arrayKeys = Object.keys({
                drawMapType, //点位
                editable: true,//可编辑的
                draggable: true, //拖动
                drawMapArray: items  //数据
              });
              arrayKeys.map((items) => {
                if (obj[items]) return obj[items]();
              });
            })
            // let items2 = [121.720448, 29.978434]
            // console.log(9992, items2);
            // let obj2 = {
            //   drawMapArray: () => {
            //     this.startEdit(items2, {
            //       drawMapType, //点位
            //       editable: true,//可编辑的
            //       draggable: true, //拖动
            //       drawMapArray: items2  //数据
            //     });
            //   },
            //   drawMapType: () => {
            //     this.drawMapType({
            //       drawMapType, //点位
            //       editable: true,//可编辑的
            //       draggable: true, //拖动
            //       drawMapArray: items2  //数据
            //     });
            //   },
            // };
            // let arrayKeys2 = Object.keys({
            //   drawMapType, //点位
            //   editable: true,//可编辑的
            //   draggable: true, //拖动
            //   drawMapArray: items2  //数据
            // });
            // arrayKeys2.map((items2) => {
            //   if (obj2[items2]) return obj2[items2]();
            // });
            // 出现
            // this.drawMapType({
            //   drawMapType, //点位
            //   editable: true,//可编辑的
            //   draggable: true, //拖动
            //   drawMapArray: undefined  //数据
            // });
          }
          this.drawMapType({
            drawMapType, //点位
            editable: true,//可编辑的
            draggable: true, //拖动
            drawMapArray: undefined  //数据
          });
          // if (drawMapArray && drawMapArray.length > 0) {
          //   drawMapArray.forEach((item, indexs) => {
          //     console.log(999, item);
          //     let obj = {
          //       drawMapArray: () => {
          //         this.startEdit(item, {
          //           drawMapType, //点位
          //           editable: true,//可编辑的
          //           draggable: true, //拖动
          //           drawMapArray: item  //数据
          //         });
          //       },
          //       drawMapType: () => {
          //         this.drawMapType({
          //           drawMapType, //点位
          //           editable: true,//可编辑的
          //           draggable: true, //拖动
          //           drawMapArray: item  //数据
          //         });
          //       },
          //     };
          //     let arrayKeys = Object.keys({
          //       drawMapType, //点位
          //       editable: true,//可编辑的
          //       draggable: true, //拖动
          //       drawMapArray: item  //数据
          //     });
          //     arrayKeys.map((item) => {
          //       if (obj[item]) return obj[item]();
          //     });
          //   })
          // } else {
          //   let obj = {
          //     // 绘制图形
          //     drawMapType: () => {
          //       this.drawMapType({
          //         drawMapType, //点位
          //         editable: true,//可编辑的
          //         draggable: true, //拖动
          //         drawMapArray: item  //数据
          //       });
          //     },
          //   };
          //   let arrayKeys = Object.keys({
          //     drawMapType, //点位
          //     editable: true,//可编辑的
          //     draggable: true, //拖动
          //     drawMapArray: item  //数据
          //   });
          //   arrayKeys.map((item) => {
          //     if (obj[item]) return obj[item]();
          //   });
          // }

          // ----------------
          // //  循环插入多边形
          // if (drawMapArray && drawMapArray.length > 0) {
          // drawMapArray.forEach(item => {
          // let obj = {
          //   // 编辑图形
          //   drawMapArray: () => {
          //     this.startEdit(item, {
          //       drawMapType,
          //       editable,
          //       draggable,
          //       drawMapArray: item
          //     });
          //   },
          //   // 绘制图形
          //   drawMapType: () => {
          //     this.drawMapType({
          //       drawMapType,
          //       editable,
          //       draggable,
          //       drawMapArray: item
          //     });
          //   },
          // };
          // let arrayKeys = Object.keys({
          //   drawMapType,
          //   editable,
          //   draggable,
          //   drawMapArray: item
          // });
          // arrayKeys.map((item) => {
          //   if (obj[item]) return obj[item]();
          // });
          // })
          // } else {
          //   let obj = {
          //     // 编辑图形
          //     // drawMapArray: () => {
          //     //   this.startEdit(item, {
          //     //     drawMapType,
          //     //     editable,
          //     //     draggable,
          //     //     drawMapArray
          //     //   });
          //     // },
          //     // 绘制图形
          //     drawMapType: () => {
          //       this.drawMapType({
          //         drawMapType,
          //         editable,
          //         draggable,
          //         drawMapArray
          //       });
          //     },
          //   };
          //   let arrayKeys = Object.keys({
          //     drawMapType,
          //     editable,
          //     draggable,
          //     drawMapArray
          //   });
          //   arrayKeys.map((item) => {
          //     if (obj[item]) return obj[item]();
          //   });
          // }
        } else {
          // console.log("销毁地图");
          if (this.map != undefined) this.map.remove();
        }
      },
    },
    color: {
      immediate: true,
      handler(val) {
        if (val) {
          let { drawTool, polygon } = this;
          if (drawTool) this.changeSymbol("drawTool", drawTool, val);
          if (polygon) this.changeSymbol("Point", polygon, val);
          // if (drawTool) {
          //   drawTool.setSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     polygonOpacity: 0.3, // 图形覆盖区域透明度
          //     lineColor: val, // 线条颜色
          //     lineWidth: 2 // 线条宽度
          //   });
          // }
          // if (polygon) {
          //   polygon.updateSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     lineColor: val // 线条颜色
          //   });
          // }
        }
      },
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  // created() { },
  //生命周期 - 挂载完成(可以访问DOM元素)
  // mounted() {
  // let a = "rgb(255, 69, 0)";
  // console.log(a.slice(5, a.length - 1));
  // },
  // beforeDestroy() {
  //   let { map } = this;
  //   // console.log(
  //   //   "🚀 ~ Date:2023/07/11 14:37 ~ File: index.vue ~ Line:154 ----- ",
  //   //   销毁地图
  //   // );
  //   if (map) map.remove();
  // },
  //方法集合
  methods: {
    // 获取到图层所有的点位
    extractCoordinates(data) {
      // console.log("获取到图层所有的点位", data);
      let datas = []
      data.forEach(res => {
        datas.push({
          "lngWgs": res._coordinates.x,
          "latWgs": res._coordinates.y
        })
      })
      // console.log(111111, datas);
      return datas;
    },
    // getSent(data) {
    //   let array = []
    //   data.forEach(res => {
    //     let arrray2 = []
    //     res._coordinates.forEach(res2 => {
    //       arrray2.push({
    //         "lngWgs": res2.x,
    //         "latWgs": res2.y,
    //         // "sort": index2
    //       })
    //     })
    //     array.push(arrray2)
    //   })
    //   return array;
    // },
    init() {
      this.$nextTick(() => {
        let { center, zoom, pitch, minZoom, maxZoom, symbol, layerSwitcherControl, id } = this;
        this.map = new maptalks.Map(id, {
          center,
          zoom,
          pitch,
          minZoom,
          maxZoom,
          centerCross: true,
          seamlessZoom: true,
          attribution: false,
          zoomControl: true, // add zoom control
          scaleControl: true, // add scale control
          layerSwitcherControl,
          symbol,
          // baseLayer 表示基础图层,它可以添加多个,逗号隔开
          baseLayer: new maptalks.GroupTileLayer("Base TileLayer", [
            // 卫星图
            new maptalks.TileLayer("卫星图", {
              urlTemplate: "https://t5.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk=074d4a21c8f34a3a20cd1f69f81b26bf",
              subdomains: ["a", "b", "c", "d"], //负载均衡-以提高地图数据加载的效率
            }),
            // 二维图
            new maptalks.TileLayer("二维图", {
              visible: false,
              urlTemplate:
                "https://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
              subdomains: ["a", "b", "c", "d"],
            })
          ]),
        });

        // 添加-地图矢量数据图层
        var tiandituLayer = new maptalks.TileLayer('tianditu', {
          urlTemplate: 'http://t0.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=074d4a21c8f34a3a20cd1f69f81b26bf',
          subdomains: ['a', 'b', 'c']
        });
        this.map.addLayer(tiandituLayer);

        // 监听图层切换监听
        this.map.getBaseLayer().on('layerload', function (e) {
          let visible = e.target.layers[0].options.visible
          if (visible) {
            // console.log("卫星图", this.map._layers[0].options.visible);
            this.map._layers[0].options.visible = true  // 显示-矢量数据图层 
          } else {
            // console.log("二维图", this.map._layers);
            this.map._layers[0].options.visible = false  // 隐藏-矢量数据图层
          }
        });

        // 创建地图容器
        // var map = new maptalks.Map('map', {
        //   center: [116.3975, 39.9085],
        //   zoom: 10,
        //   baseLayer: new maptalks.TileLayer('base', {
        //     urlTemplate: 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
        //     subdomains: ['a', 'b', 'c']
        //   })
        // });  
        // this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer2 = new maptalks.VectorLayer("vector2").addTo(this.map)
        // this.map.on("click", function (params) {
        // });
        // this.map.on("editrecord", function (params) {
        // console.log(params);
        // });
      });
    },
    // 绘制图形
    drawMapType(val) {
      // !this.layer ? this.layer = new maptalks.VectorLayer("vector").addTo(this.map) : null
      // console.log('绘制图形', val, this.map);
      let { drawMapType, drawMapArray } = val;
      if (!drawMapArray) {
        let { map, symbol, color } = this;
        let that = this;
        // var layer = new maptalks.VectorLayer("vector").addTo(map);
        var drawTool = new maptalks.DrawTool({
          mode: drawMapType,
          // once: true,
          // once: false,
          symbol: drawMapType == "Point" ? null : symbol,
        })
          .addTo(map)
          .disable();
        drawTool.on("drawend", function (param) {
          // console.log(param.geometry);
          let { _coordinates } = param.geometry;
          let array = null;
          if (drawMapType == "Point") {
            array = [_coordinates.x, _coordinates.y];
          } else if (drawMapType == "Polygon") {
            array = _coordinates.map((item) => {
              return [item.x, item.y];
            });
          }
          that.dataLis.push(array)
          // console.log(123, array);
          that.layer.addGeometry(param.geometry);
          that.startEdit(array, val, that.dataLis.length - 1);
          that.layer.remove();
          that.layer.setZIndex(6);
          // that.$nextTick(() => {
          // console.log("绘制好了 发送", that.getSent(that.layer2._geoList));
          // that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          // })
          // console.log(666666, that.extractCoordinates(that.layer._geoList));
          // that.$emit("drawPointChange", that.extractCoordinates(that.layer._geoList));
          // console.log(666666, that.layer._geoList);
        });
        this.drawTool = drawTool;
        drawTool.setMode(drawMapType).enable();
        // 改变覆盖物设置
        if (color) this.changeSymbol("drawTool", drawTool, color);
        // if (color) {
        //   drawTool.setSymbol({
        //     polygonFill: color, // 图形覆盖颜色
        //     polygonOpacity: 0.3, // 图形覆盖区域透明度
        //     lineColor: color, // 线条颜色
        //     lineWidth: 2 // 线条宽度
        //   });
        // }
      }
    },
    // 编辑绘制图形
    startEdit(array, val) {
      // let nun = Math.random();
      // console.log("编辑绘制图形", array, val);
      let that = this;
      let { drawMapType, editable, draggable } = val;
      let { symbol, map, pointSymbol, color } = that;
      let type = null;
      // let pointArray = _.clone(array);
      // that.$emit("drawPointChange", pointArray);
      // setTimeout(()=>{
      //   that.$emit("drawPointChange", that.extractCoordinates(that.layer2._geoList));
      // },3000)
      let objArray = [
        [() => drawMapType == "Point",
        () => {
          type = "Marker";
        },
        () => {
          // 更改位置
          // polygon.on("shapechange", function (param) {
          //   console.log(6666666666, param, that.extractCoordinates(that.layer2._geoList));
          //   // that.extractCoordinates(that.layer._geoList)
          //   // let { _coordinates } = param.target;
          //   // pointArray = [_coordinates.x, _coordinates.y];
          //   // that.$emit("drawPointChange", pointArray);
          //   that.$emit("drawPointChange", that.extractCoordinates(that.layer2._geoList));
          // });
          // 更改位置
          polygon.on("positionchange", function (param) {
            // console.log(110, param, that.extractCoordinates(that.layer2._geoList));
            // that.extractCoordinates(that.layer._geoList)
            // let { _coordinates } = param.target;
            // pointArray = [_coordinates.x, _coordinates.y];
            // that.$emit("drawPointChange", pointArray);
            that.$emit("drawPointChange", that.extractCoordinates(that.layer2._geoList));
          });
          // 更改位置
          polygon.on("remove", function (param) {
            // console.log(110, param, that.extractCoordinates(that.layer2._geoList));
            // that.extractCoordinates(that.layer._geoList)
            // let { _coordinates } = param.target;
            // pointArray = [_coordinates.x, _coordinates.y];
            // that.$emit("drawPointChange", pointArray);
            that.$emit("drawPointChange", that.extractCoordinates(that.layer2._geoList));
          });
        },
        ]
      ];
      let state = objArray.find((m) => m[0]());
      if (state) state[1]();
      let polygon = new maptalks[type](array, {
        visible: true,
        editable,
        cursor: "pointer",
        draggable,
        dragShadow: false,
        drawOnAxis: null,
        symbol: drawMapType == "Point" ? null : symbol,
      });
      var options = {
        'items': [
          {
            item: '删除', click: function (e) {
              that.layer2.removeGeometry(polygon);

            }
          }
        ]
      };
      polygon.setMenu(options).openMenu();
      // new maptalks.VectorLayer("vectorEdit" + nun, polygon).addTo(map);
      that.layer2.addGeometry(polygon);
      that.$emit("drawPointChange", that.extractCoordinates(that.layer2._geoList));
      // that.layer.addGeometry(polygon);
      map.fitExtent(polygon.getExtent(), -1); // 自动适配区域
      if (color) this.changeSymbol("Point", polygon, color);
      if (state) state[2]();
      that.polygon = polygon;
    },
    // 覆盖物设置更改
    changeSymbol(type, mapObj, color) {
      let obj = {
        drawTool: () => {
          mapObj.setSymbol({
            polygonFill: color, // 图形覆盖颜色
            polygonOpacity: 0.3, // 图形覆盖区域透明度
            lineColor: color, // 线条颜色
            lineWidth: 2, // 线条宽度
          });
        },
        polygon: () => {
          mapObj.updateSymbol({
            polygonFill: color, // 图形覆盖颜色
            lineColor: color, // 线条颜色
          });
        },
      };
      if (obj[type]) return obj[type]();
    },
  },
};
</script>
<style scoped>
.container {
  width: calc(100% - 50px);
  /* width: 550px; */
  min-height: 550px;
  margin: 15px;
}

/deep/ .maptalks-layer-switcher .panel .group:nth-child(2) {
  display: none !important;
}

/deep/ .maptalks-layer-switcher .panel {
  padding: 15px 0;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有趣的 Streamlit

先看一则新闻&#xff1a;「Snowflake」以8亿美元收购「Streamlit」&#xff0c;以帮助客户构建基于数据的应用程序 Streamlit 是什么&#xff1f;去年过年前好好研究学习了一番&#xff0c;的确是个很有意思的面向数据开发者的工具&#xff0c;让不懂前端&#xff0c;只懂一点…

SpringBoot配置文件日志

目录 一、SpringBoot配置文件的作用 二、SpringBoot配置文件的分类 1、application.properties 2、application.yml 3、application.yaml 三、使用配置文件实例--验证码 1、使用Kaptcha插件生成验证码 2、网页需求分析 3、前端页面 4、发送请求 5、服务器作出响应 …

反射reflecttion的入门理解+暴力反射的应用简介

反射怎么理解,&#xff08;个人白话理解,有个类,类中有很多属性、方法、构造器&#xff0c;可以通过一面镜子将类里面的东西像光一样反射出来&#xff0c;被我们看到和使用&#xff0c;reflecttion其实也可以理解为映像&#xff0c;主要为了获取类中私有的东西&#xff0c;通过…

骨传导耳机是什么?骨传导耳机的优缺点是什么

骨传导耳机是什么&#xff1f;骨传导耳机采用一种创新的声音传输方式&#xff0c;它通过人体的颅骨、骨迷路、内耳淋巴液、螺旋器和听觉中枢传递声波。与传统耳机不同&#xff0c;骨传导耳机仅需悬挂在耳旁即可听见声音。 骨传导耳机的优缺点 缺点 相较传统耳机&#xff0c;由…

高数总结(6

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

走进科学系列之遭遇鬼打墙的OUTLOOK

网管小贾 / sysadm.cc 正值春运&#xff0c;车站里熙熙攘攘、人头攒动。 鲍勃和约瑟夫正在候车室&#xff0c;等待检票。 “嗨&#xff01;约瑟夫&#xff01;快来看看&#xff0c;我的电脑出问题了&#xff01;” “得了吧&#xff0c;马上就要检票上车了&#xff0c;你就不…

第99讲:MHA高可用集群配置实战:邮件告警和Binlog服务器搭建详解

文章目录 一、配置当MHA故障切换时发生邮件告警1.准备发送邮件的脚本2.配置MHA支持邮箱告警3.重启MHA4.模拟主库故障切换观察邮件接收 二、为MHA高可用集群配置Binlog服务器1.为什么要配置Binlog服务器2.搭建Binlog服务器2.1.创建保存主库Binlog的路径2.2.配置MHA增加Binlog服务…

MySQL Replication

0 序言 MySQL Replication 是 MySQL 中的一个功能&#xff0c;允许从一个 MySQL 数据库服务器&#xff08;称为主服务器或 master&#xff09;复制数据和数据库结构到另一个服务器&#xff08;称为从服务器或 slave&#xff09;。这种复制是异步的&#xff0c;意味着从服务器不…

特征选择、特征降维和特征提取到底有什么区别和联系?这篇文章一次性给你讲清楚!

目录 一、特征选择&#xff1a; 1.最大互信息系数(MIC)&#xff1a; 2.互信息(MI)&#xff1a; 3.最大相关最小冗余算法(mRMR)&#xff1a; 4.支持向量机递归特征消除(SVM_RFE)&#xff1a; 二、特征降维&#xff1a; 1.主成分分析(PCA)&#xff1a; 2.核主成分分析(KP…

有哪些好用的网页原型网站?

与桌面端相比&#xff0c;在线网页原型网站的使用具有优势&#xff0c;因为在线网页原型网站在整个使用过程中不需要安装&#xff0c;在线网页原型网站在任何地方都没有限制。更重要的是&#xff0c;无论是现在使用的Linux&#xff0c;在线网页原型网站在操作系统中都没有限制、…

智胜未来,新时代IT技术人风口攻略-第六版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一种严谨态度企业对鸿蒙的一些诉求 …

opencv安装介绍以及基本图像处理详解

文章目录 一、什么是OpenCV &#xff1f;二. OpenCV 安装1. 下载地址2.安装命令&#xff1a;pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作&#xff08;彩色图片&#xff09;&#xff08;1&#xff09;读取图片&#xff1a;cv2.imread( )&#xff08…

OPPO公布全新AI战略,AI 手机时代再提速

2024年2月20日&#xff0c;深圳——今日OPPO 举办 AI 战略发布会&#xff0c;分享新一代 AI 手机的四大能力特征&#xff0c;展望由AI驱动的手机全栈革新和生态重构的趋势&#xff0c;并发布由OPPO AI 超级智能体和 AI Pro 智能体开发平台组成的OPPO 1N 智能体生态战略&#xf…

数论 - 容斥原理

文章目录 一、题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 二、算法思路三、代码 在计数时&#xff0c;必须注意没有重复&#xff0c;没有遗漏。为了使重叠部分不被重复计算&#xff0c;人们研究出一种新的计数方法&#xff0c;这种方法的基本思…

酷开科技 | 酷开系统壁纸模式,让过年更有氛围感!

在阵阵爆竹声中&#xff0c;家家户户都沉浸在浓浓的年味中。过年&#xff0c;是团圆&#xff0c;是温暖。团团圆圆的日子里&#xff0c;仪式感不可少&#xff0c;换上一张喜气洋洋的电视壁纸吧&#xff0c;寓意幸福一年又一年。打开酷开系统壁纸模式挑选一张年味十足的壁纸&…

pyside6 两个页面互相跳转

kuka示教器嵌套UR界面操作ros中rviz的UR机器人-CSDN博客 接上一篇&#xff0c;探索了两个页面互相跳转的操作。 1.两个页面 页面&#xff1a;UrWin,主要显示Ur机器人的VNC远程控制界面 页面&#xff1a;ZcWin,主要是选择插针的长度 在Ur远程界面点击下一步会跳转到针选择界面…

前端-游览器渲染原理

渲染 render vue react render 游览器渲染 html字符串 - > 像素信息 游览器是如何渲染页面的? 当游览器的网络线程收到 html文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程. 整…

梵宁教育被误解投诉诈骗全过程始末

近日&#xff0c;梵宁教育因被部分用户投诉涉嫌诈骗而引起了社会的广泛关注。作为一家有着深厚教育背景和良好教育理念的机构&#xff0c;梵宁教育对此事表示高度重视&#xff0c;并在此做出如下澄清和回应。 近期&#xff0c;梵宁教育接到了一些用户的投诉&#xff0c;称其在参…

每日一题——LeetCode1464.数组中两元素的最大乘积

这题就是找数组里的最大值和次大值 方法一 排序 var maxProduct function(nums) {nums.sort((a,b)>b-a)return (nums[0] - 1) * (nums[1] - 1); }; 消耗时间和内存情况&#xff1a; 方法二 一次遍历&#xff1a; var maxProduct function(nums) {let first-1,second-…

常见面试题:TCP的四次挥手和TCP的滑动窗口

说一说 TCP 的四次挥手。 挥手即终止 TCP 连接&#xff0c;所谓的四次挥手就是指断开一个 TCP 连接时。需要客户端和服务端总共发出四个包&#xff0c;已确认连接的断开在 socket 编程中&#xff0c;这一过程由客户端或服务端任意一方执行 close 来触发。这里我们假设由客户端…