{"version":3,"file":"Draw.mjs","sources":["../../../../../../packages/sdk/plugins/Draw/Draw.ts"],"sourcesContent":["import '@geoman-io/leaflet-geoman-free'\nimport '@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css'\nimport { createApp, toRaw } from 'vue'\nimport { merge } from 'lodash-unified'\nimport L, { Icon, Point } from 'leaflet'\nimport StyleEditor from '@map-sdk/components/drawStyleEditor'\nimport type { GeoJsonObject } from 'geojson'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\nimport 'leaflet-semicircle'\nimport 'leaflet-ellipse'\n\nexport interface StylePolygon {\n  color?: string\n  weight?: number\n  opacity?: number\n  fillColor?: string\n  fillOpacity?: number\n  dashArray?: number[]\n  fill?: boolean\n  stroke?: boolean\n  editComonent?: any\n  data?: GeoJsonObject | GeoJsonObject[]\n  [key: string]: any\n}\n\n// Marker: 代表地图上的一个点状标记。通常用于表示特定地理位置上的兴趣点（POI）、导航指示点、或者任何需要在地图上精确定位的点状数据。Marker 可以包含图标（如自定义图片）和文字标签（tooltip 或 popup），并可以进行交互，如点击弹出详细信息。\n\n// Circle: 表示地图上的圆形区域。由中心点坐标和半径定义，可用于表示圆形范围、覆盖区、影响区域等。Circle 也可以设置填充色、边框样式、透明度等属性，并支持交互功能。\n\n// Line: 表示地图上的线段或折线。用于绘制路径、边界、流线、航线等连续的线性特征。Line 由一系列坐标点组成，可以设置线型（实线、虚线等）、颜色、宽度等样式属性，并支持鼠标悬停、点击等交互。\n\n// Rectangle: 代表地图上的矩形区域。由对角线上的两个点确定其位置和尺寸。Rectangle 可以用来表示矩形建筑物、规划区域、监测范围等，支持填充、描边等样式设置以及相关的交互事件。\n\n// Polygon: 表示地图上的多边形区域。由一系列闭合的坐标点序列构成，可以表示复杂的不规则区域，如地块、湖泊、行政区划等。Polygon 支持填充色、边框样式、洞穴（holes）等特性，并可进行交互操作。\n\n// Cut: 如果出现在这个列表中，可能是指一种编辑操作，即通过绘制另一图形来“切割”已有图形的功能。在 GIS 和地图编辑工具中，这通常涉及到拓扑操作，允许用户分割或修剪已有的 Polygon、Line 等图层。@geoman-io/leaflet-geoman-free 中的 pm:cut 事件就是与此相关的。\n\n// CircleMarker: 类似于 Marker，但表现为固定半径的圆形标记，而非自定义图标。常用于表示相对较小的点状数据，如气象站、传感器位置等，当不需要复杂图标或精确指向箭头时使用。\n\n// ImageOverlay: 将一张图像以指定地理坐标范围的方式叠加在地图上。常用于显示历史地图、卫星影像、热力图、航拍照片等。ImageOverlay 可以调整透明度、缩放行为，并支持平移和缩放时保持相对于地图的固定位置。\n\n// Text: 表示在地图上直接显示的文本标签。虽然 Leaflet 核心库本身并未内置 Text 图层，但可以通过插件（如 Leaflet.TextPath、Leaflet.label 等）实现这一功能，用于标注地点名称、说明文字、数值等信息。文本可以设置字体、颜色、大小、对齐方式等样式，并可随地图视图动态更新位置。\nexport type DrawType =\n  | 'Marker'\n  | 'Circle'\n  | 'Line'\n  | 'Rectangle'\n  | 'Polygon'\n  | 'Cut'\n  | 'CircleMarker'\n  | 'ImageOverlay'\n  | 'Text'\nlet geojsonLayers: L.FeatureGroup<any>\nexport class DrawManager {\n  //多边形默认样式\n  geoJsonStylePolygon: StylePolygon = {\n    color: '#ff3333',\n    weight: 3,\n    opacity: 1,\n    fillColor: '#ff3333',\n    fillOpacity: 0.2,\n    dashArray: [5, 5],\n    fill: true,\n    stroke: true,\n  }\n  _map: MyMap\n  _options: StylePolygon\n  gsonLayer: Record<string, any> = {}\n  constructor(map: MyMap, options?: StylePolygon) {\n    this._map = map\n    this._options = merge(this.geoJsonStylePolygon, options)\n    this.init()\n  }\n  init() {\n    geojsonLayers = L.featureGroup([]).addTo(this._map)\n    //监听图层鼠标事件\n    geojsonLayers.on('click', this.onClickGeojsonLayers)\n\n    const customTranslation = {\n      tooltips: {\n        finishLine: '单击任何存在的标记或者双击以完成',\n        finishPoly: '单击第一个标记或者双击完成以完成',\n      },\n    }\n    this._map.pm.setLang('zh', customTranslation, 'customName')\n    this._map.pm.addControls({\n      position: 'topleft',\n      drawMarker: false,\n      drawCircleMarker: false,\n      drawCircle: false,\n      drawPolyline: false,\n      drawRectangle: false,\n      drawPolygon: false,\n      editMode: false,\n      dragMode: false,\n      cutPolygon: false,\n      drawText: false,\n      removalMode: false,\n      drawEllipse: false,\n      rotateMode: false,\n      ...this._options.pmConfig,\n    })\n\n    // // 自定义扇形工具示例\n    // this._map.pm.Toolbar.createCustomControl({\n    //   name: '扇形',\n    //   block: 'draw',\n    //   // icon: 'fa fa-pie-chart', // 使用Font Awesome图标或其他图标库\n    //   onClick: () => {\n    //     // 触发你的扇形绘制逻辑\n    //     const centerLatLng = this._map.getCenter() // 示例：以地图中心为默认位置\n    //     L.semiCircle(centerLatLng, {\n    //       // 中心点坐标\n    //       radius: 60, // 半径，单位米\n    //       startAngle: -45, // 起始角度，以度为单位，从北方开始逆时针计算\n    //       stopAngle: 45, // 结束角度\n    //       fillColor: '#ff7800', // 填充颜色\n    //       fillOpacity: 0.5, // 填充透明度\n    //       stroke: true,\n    //       color: '#000', // 边缘颜色\n    //       dashArray: [],\n    //       weight: 3,\n    //       opacity: 1,\n    //       clickable: true,\n    //       draggable: false, // 是否可拖动，默认为false\n    //       keyboard: true,\n    //       zIndexOffset: 1000\n    //     }).addTo(this._map) // 将扇形添加到地图实例上\n    //   }\n    // })\n    // // 自定义同心圆工具示例\n    // this._map.pm.Toolbar.createCustomControl({\n    //   name: '同心圆',\n    //   block: 'draw',\n    //   onClick: () => {\n    //     // 假设你已经有了基础圆的LatLng坐标和半径\n    //     const center = this._map.getCenter() // 示例中心点\n    //     const baseRadius = 60 // 基础圆的半径\n    //     let newRadius = baseRadius * 2 // 新圆的半径，例如基础圆的两倍\n\n    //     //绘制同心圆\n    //     //设置圆心坐标\n    //     for (let i = 0; i < 2; i++) {\n    //       //添加圆\n    //       L.circle(center, {\n    //         //圆半径\n    //         radius: newRadius,\n    //         //颜色\n    //         color: '#ffcc33',\n    //         //填充色\n    //         // fillColor: 'white',\n    //         //填充色透明度\n    //         fillOpacity: 0.5\n    //       }).addTo(this._map)\n    //       //调整半径大小\n    //       newRadius = newRadius / 1.5\n    //     }\n    //   }\n    // })\n    // // 自定义网格工具示例\n    // this._map.pm.Toolbar.createCustomControl({\n    //   name: '网格',\n    //   block: 'draw',\n    //   onClick: () => {\n    //     //绘制矩形网格\n    //     //绘制经线\n    //     for (let i = 0; i < 11; i++) {\n    //       L.polyline(\n    //         [\n    //           [36.18, 120.36 + i * 0.001],\n    //           [36.19, 120.36 + i * 0.001]\n    //         ],\n    //         { color: 'red' }\n    //       ).addTo(this._map)\n    //     }\n    //     //绘制纬线\n    //     for (let j = 0; j < 11; j++) {\n    //       L.polyline(\n    //         [\n    //           [36.18 + j * 0.001, 120.36],\n    //           [36.18 + j * 0.001, 120.37]\n    //         ],\n    //         { color: 'red' }\n    //       ).addTo(this._map)\n    //     }\n\n    //     //绘制平行四边形网格\n    //     //绘制经线，倾斜\n    //     for (let i = 0; i < 9; i++) {\n    //       L.polyline(\n    //         [\n    //           [36.13, 120.33 + i * 0.00375],\n    //           [36.16, 120.33 + (i + 1) * 0.00375]\n    //         ],\n    //         { color: 'red' }\n    //       ).addTo(this._map)\n    //     }\n\n    //     //绘制纬线,水平\n    //     for (let j = 0; j < 9; j++) {\n    //       L.polyline(\n    //         [\n    //           [36.13 + j * 0.00375, 120.33 + (j * 0.00375) / 8],\n    //           [36.13 + j * 0.00375, 120.36 + (j * 0.00375) / 8]\n    //         ],\n    //         { color: 'red' }\n    //       ).addTo(this._map)\n    //     }\n    //   }\n    // })\n\n    // // 自定义椭圆工具示例\n    // this._map.pm.Toolbar.createCustomControl({\n    //   name: '椭圆',\n    //   block: 'draw',\n    //   onClick: () => {\n    //     // 椭圆的中心点\n    //     const latlng = this._map.getCenter()\n    //     // 椭圆的参数\n    //     const majorRadius = 200 // 横轴半径，单位为米\n    //     const minorRadius = 100 // 纵轴半径，单位为米\n    //     const axis = 'north' // 椭圆的轴方向，可以是'center', 'west', 'east', 'north' 或 'south'\n    //     const rotation = 40 // 椭圆的角度，单位为度\n    //     // 绘制椭圆\n    //     L.ellipse(latlng, [majorRadius, minorRadius], rotation, {\n    //       axis,\n    //       color: 'red',\n    //       weight: 1,\n    //       fillOpacity: 0.2,\n    //       fillColor: '#f03'\n    //     }).addTo(this._map)\n    //   }\n    // })\n\n    //当一个图形被绘制完毕后调用，参数包含图形类型和工作图层。\n    this._map.on('pm:create', (e: any) => {\n      const drawnFeature = e.layer\n      const featureType = e.shape\n      switch (featureType) {\n        case 'Rectangle':\n        case 'Polygon':\n        case 'Circle':\n        case 'Line':\n          e.layer.options = { ...this._options, shape: e.shape } as any\n          break\n      }\n      // 根据绘制的图形类型处理区域信息\n      switch (featureType) {\n        case 'Circle':\n          // const circleCenter = drawnFeature.getLatLng()\n          // const circleRadius = drawnFeature.getRadius()\n          // console.log('Drawn Circle:', {\n          //   center: circleCenter,\n          //   radius: circleRadius,\n          // })\n          break\n\n        case 'Rectangle':\n          // const rectangleBounds = drawnFeature.getBounds()\n          // console.log('Drawn Rectangle:', {\n          //   bounds: rectangleBounds.toBBoxString(),\n          // })\n          break\n\n        case 'Polygon':\n        case 'Polyline':\n        case 'Line':\n          // const vertices = drawnFeature.getLatLngs()\n          // console.log(`Drawn ${featureType}:`, {\n          //   vertices: vertices.map((latLng: any) => [latLng.lat, latLng.lng]),\n          // })\n          break\n\n        default:\n          console.log(`Unsupported feature type drawn: ${featureType}`)\n      }\n      geojsonLayers.addLayer(e.layer)\n    })\n\n    this._map.on('pm:drawstart', ({ workingLayer }) => {\n      // 当一个节点被添加的时候调用，参数包含新的节点，它的marker，索引，工作图层和图形类型。\n      workingLayer\n        .on('pm:vertexadded', (e: any) => {\n          console.log('点了一个点', e)\n        })\n        .on('pm:snapdrag', (e: any) => {\n          console.log('在移动一个点中调用，参数包含影响图层和捕捉计算。', e)\n        })\n        .on('pm:snap', (e: any) => {\n          console.log('当一个节点被捕捉后调用，参数同上。', e)\n        })\n        .on('pm:unsnap', (e: any) => {\n          console.log('当一个节点失去捕捉后调用，参数同上。', e)\n        })\n        .on('pm:centerplaced', (e: any) => {\n          console.log('当图形的中心点被替换或移动后调用。', e)\n        })\n    })\n    //当绘制模式关闭的时候调用，参数包含图形类型。\n    this._map\n      .on('pm:drawend', (e: any) => {\n        console.log(e)\n      })\n      .on('pm:update', (e) => {\n        // 图形更新事件\n        const updatedGeoJson = e.layer //.toGeoJSON()\n        // 发送到服务器或更新本地存储\n        console.log(updatedGeoJson)\n      })\n      .on('pm:remove', (e) => {\n        // 图形删除事件\n        const removedGeoJson = e.layer //.toGeoJSON()\n        // 从服务器或本地存储中删除对应数据\n        console.log(removedGeoJson)\n      })\n  }\n  onClickGeojsonLayers(event: { layer: any }) {\n    const clickedLayer = event.layer\n\n    // 如果已有一个挂载的StyleEditor迷你应用，先卸载它\n    if (clickedLayer._styleEditorApp) {\n      clickedLayer._styleEditorApp.unmount()\n    }\n\n    let popup = clickedLayer.getPopup()\n    if (!popup) {\n      popup = L.popup()\n      clickedLayer.bindPopup(popup)\n    }\n\n    // 创建并打开包含StyleEditor的Popup\n    popup.setContent(\n      `<div class=\"popup-content\">\n        <style-editor :layer=\"clickedLayer\" :map=\"map\"></style-editor>\n      </div>`\n    )\n    clickedLayer.openPopup()\n\n    // Vue3中使用createApp创建一个迷你应用来渲染StyleEditor组件\n    const popupContentEl = document.querySelector('.popup-content')\n    const popupApp = createApp(StyleEditor, {\n      layer: clickedLayer,\n      map: this._map,\n    })\n    popupContentEl && popupApp.mount(popupContentEl)\n    clickedLayer._styleEditorApp = popupApp\n  }\n  remove(id?: string) {\n    for (const iterator of Object.keys(this.gsonLayer)) {\n      if (iterator === id || !id) {\n        const { theCollection, marker } = this.gsonLayer[iterator]\n        theCollection?.remove()\n        if (marker) {\n          this._map.removeLayer(marker)\n          this.gsonLayer[iterator].marker = ''\n        }\n      }\n    }\n    if (!id) this.gsonLayer = {}\n  }\n\n  _DataEcho(id: string, geoJsonData?: GeoJsonObject | GeoJsonObject[]) {\n    if (!geoJsonData) return\n    const theCollection = L.geoJson(geoJsonData as any, {\n      style: (feature: any) => {\n        return {\n          color: '#ff3333',\n          weight: 2,\n          opacity: 1,\n          fillColor: '#ff3333',\n          fillOpacity: 0.5,\n          ...(feature.style || {}),\n        }\n      },\n      pointToLayer: (feature: any, latlng) => {\n        if (feature.properties.customGeometry) {\n          return new L.Circle(latlng, feature.properties.customGeometry.radius)\n        }\n        if (feature.icon) {\n          const m = new L.Marker(latlng, {\n            icon: feature.icon,\n          })\n          if (feature.showHtml) {\n            m.bindTooltip(`<em></em>${feature.showHtml}`, {\n              direction: 'right',\n              permanent: false,\n              className: 'nav_tooltip',\n              ...(feature.showHtmlOptions || {}),\n            })\n          }\n          return m\n        }\n        return null as any\n      },\n      onEachFeature: (feature: any, layer) => {\n        // 添加编辑\n        // geojsonLayers.addLayer(layer)\n\n        // 检查图层是否是多边形\n        if (layer instanceof L.Polygon) {\n          if (feature.nameShow && !this.gsonLayer[id]?.marker) {\n            // 获取多边形的边界框\n            const bounds = layer.getBounds()\n            // 计算边界框的中心点\n            const center = bounds.getCenter()\n            const content = feature.name\n            const styleToString = (style: { [x: string]: any }) => {\n              return Object.keys(style).reduce(\n                (acc, key) =>\n                  `${\n                    acc +\n                    key\n                      .split(/(?=[A-Z])/)\n                      .join('-')\n                      .toLowerCase()\n                  }:${style[key]};`,\n                ''\n              )\n            }\n            const myIcon = L.divIcon({\n              html: `<div style='${styleToString(\n                feature.nameFont || {}\n              )}'>${content}</div>`,\n              className: 'my-div-icon',\n              iconSize: new Point(0, 0),\n            })\n\n            //中心点位\n            const marker = L.marker(center, { icon: myIcon }).addTo(this._map)\n\n            this.gsonLayer[id] = {\n              marker,\n            }\n          }\n        }\n        // 启用每个图层的编辑状态\n        // ;(layer as any).pm.enable(true)\n      },\n    })\n    theCollection.addTo(this._map)\n\n    this.gsonLayer[id] = { theCollection, ...(this.gsonLayer[id] || {}) }\n    // theCollection.pm.toggleEdit({\n    //   draggable: true,\n    //   snappable: true\n    // })\n    this._map.fitBounds(theCollection.getBounds())\n\n    theCollection.on('pm:edit', (e) => {\n      console.log('编辑结束', e)\n    })\n    theCollection.on('pm:dragstart', (e) => {\n      console.log('拖拽开始', e)\n    })\n  }\n\n  public drawPolygon(type: DrawType, options?: L.PM.DrawModeOptions) {\n    const map = toRaw(this._map)\n    map.pm.enableDraw(type, { ...this._options, ...options } as any)\n  }\n}\n"],"names":["i","DrawManager","constructor","n","o","this","geoJsonStylePolygon","color","weight","opacity","fillColor","fillOpacity","dashArray","fill","stroke","gsonLayer","_map","_options","w","init","s","featureGroup","addTo","on","onClickGeojsonLayers","pm","setLang","tooltips","finishLine","finishPoly","addControls","position","drawMarker","drawCircleMarker","drawCircle","drawPolyline","drawRectangle","drawPolygon","editMode","dragMode","cutPolygon","drawText","removalMode","drawEllipse","rotateMode","pmConfig","layer","shape","options","addLayer","workingLayer","e","_styleEditorApp","unmount","getPopup","popup","bindPopup","setContent","openPopup","t","document","querySelector","a","h","k","map","mount","remove","Object","keys","theCollection","marker","removeLayer","_DataEcho","geoJson","style","pointToLayer","properties","customGeometry","Circle","radius","icon","r","Marker","showHtml","bindTooltip","direction","permanent","className","showHtmlOptions","onEachFeature","Polygon","nameShow","c","getBounds","getCenter","y","name","m","l","reduce","f","p","split","join","toLowerCase","d","divIcon","html","nameFont","iconSize","L","g","fitBounds","u","enableDraw"],"mappings":"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"}