{"version":3,"file":"SeaMapToolSymbol.mjs","sources":["../../../../../../../packages/sdk/plugins/AreaView/layer/SeaMapToolSymbol.ts"],"sourcesContent":["import L from 'leaflet'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { AreaViewBase } from '@map-sdk/sdk/plugins/AreaView/AreaViewBase'\nimport type { AreaViewBaseOptions } from '@map-sdk/sdk/plugins/AreaView/AreaViewBase'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\ninterface SeaMapDataItem {\n  space: number\n  id: string\n  points: L.LatLng[]\n  updateDate: string\n  mappingScale: string\n  displayLevel: string\n}\n\nclass SeaMapToolSymbol extends AreaViewBase {\n  _show() {\n    if (!this._data) {\n      console.error('区域图形展示，请求无数据！')\n      return this\n    }\n    this._data = this.formatData(this._data)\n\n    const viewZonesStr = this.options.viewZones\n    if (CommUtils.isEmpty(viewZonesStr)) {\n      return this\n    }\n    const zoneDataMap: Record<string, SeaMapDataItem> = {}\n    const viewZones = `${viewZonesStr}`.split(',')\n\n    for (const viewZone of viewZones) {\n      const items = this._data[`zone_${viewZone}`]\n      if (items && items.length) {\n        for (const item of items) {\n          const itemId = item.id\n          zoneDataMap[itemId] = item\n\n          const boundsBoxArea = CanvasShipUtils.getLatLngBoundsBoxArea(\n            zoneDataMap[itemId].points\n          )\n          const splitBounds =\n            CanvasShipUtils.getSplitLatLngBounds180(boundsBoxArea)\n\n          for (const [k, splitBound] of splitBounds.entries()) {\n            const swPoint = splitBound.getSouthWest()\n            const nePoint = splitBound.getNorthEast()\n            const sePoint = splitBound.getSouthEast()\n            const nwPoint = splitBound.getNorthWest()\n\n            if (k > 0) {\n              const newItemId = `${itemId}_${k}`\n              zoneDataMap[newItemId] = { ...zoneDataMap[itemId] }\n              zoneDataMap[newItemId].points = [\n                swPoint,\n                sePoint,\n                nePoint,\n                nwPoint,\n              ]\n              zoneDataMap[newItemId].space =\n                Math.abs(swPoint.lat - nePoint.lat) *\n                Math.abs(swPoint.lng - nePoint.lng)\n            } else {\n              zoneDataMap[itemId].points = [swPoint, sePoint, nePoint, nwPoint]\n              zoneDataMap[itemId].space =\n                Math.abs(swPoint.lat - nePoint.lat) *\n                Math.abs(swPoint.lng - nePoint.lng)\n            }\n          }\n        }\n      }\n    }\n\n    const sortedDataItems: SeaMapDataItem[] = []\n    for (const key in zoneDataMap) {\n      sortedDataItems.push(zoneDataMap[key])\n    }\n\n    sortedDataItems.sort((a, b) => b.space - a.space)\n\n    for (const sortedDataItem of sortedDataItems) {\n      this.drawBoundary(sortedDataItem, 'red')\n    }\n\n    return this\n  }\n\n  private drawBoundary(item: SeaMapDataItem, color: string) {\n    const popupContent = () => {\n      let html = ''\n      html += '<div class=\"box\">'\n      html += '<div class=\"title\">'\n      html += item.id\n      html += '</div>'\n      html += `<div class=\"field\">更新日期：${item.updateDate}</div>`\n      html += `<div class=\"field\">制图比例：${item.mappingScale}</div>`\n      html += `<div class=\"field\">显示级别：${item.displayLevel}</div>`\n      html += '</div>'\n      return html\n    }\n\n    const polygonOptions = {\n      color,\n      opacity: 1,\n      weight: 1,\n      fillOpacity: 0,\n    }\n\n    const polygon = L.polygon(item.points, polygonOptions)\n      .bindPopup(popupContent, {\n        className: 'shipxy_popup',\n        closeButton: false,\n      })\n      .addTo(this._map)\n\n    this._areaLayers.push(polygon)\n  }\n\n  private formatData(_data: any[]): Record<string, SeaMapDataItem[]> {\n    const formattedData: Record<string, SeaMapDataItem[]> = {}\n\n    for (const _datum of _data) {\n      _datum.p = this.latLngFormat(_datum.p)\n      const displayLevels = _datum.dataRead.split(',')\n      for (const displayLevel of displayLevels) {\n        const zoneKey = `z_${displayLevel}`\n        if (!(zoneKey in formattedData)) {\n          formattedData[zoneKey] = []\n        }\n        formattedData[zoneKey].push(_datum)\n      }\n    }\n\n    return formattedData\n  }\n\n  private latLngFormat(pointsStr: string): L.LatLng[] {\n    const pointsArray: L.LatLng[] = []\n\n    if (CommUtils.isEmpty(pointsStr)) {\n      return pointsArray\n    }\n\n    const pointPairs = pointsStr.split(',')\n    for (const pointPair of pointPairs) {\n      const [lat, lng] = pointPair.split('|')\n      pointsArray.push(L.latLng(Number.parseFloat(lat), Number.parseFloat(lng)))\n    }\n\n    return pointsArray\n  }\n}\n\nconst seaMapToolSymbol = (map: MyMap, options?: Partial<AreaViewBaseOptions>) =>\n  new SeaMapToolSymbol(map, options)\nexport { SeaMapToolSymbol, seaMapToolSymbol }\n"],"names":["L","S","_show","this","_data","formatData","s","options","viewZones","y","isEmpty","t","e","split","o","a","length","m","i","id","w","v","getLatLngBoundsBoxArea","points","M","getSplitLatLngBounds180","f","l","entries","r","getSouthWest","p","getNorthEast","g","getSouthEast","h","getNorthWest","d","space","Math","abs","lat","lng","n","push","sort","drawBoundary","color","opacity","weight","fillOpacity","u","polygon","bindPopup","updateDate","mappingScale","displayLevel","className","closeButton","addTo","_map","_areaLayers","latLngFormat","dataRead","latLng","Number","parseFloat","D","c"],"mappings":"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"}