{"version":3,"file":"SeaRouteSymbol.mjs","sources":["../../../../../../../packages/sdk/plugins/AreaView/layer/SeaRouteSymbol.ts"],"sourcesContent":["import { buffer, lineString } from 'turf'\nimport L from 'leaflet'\nimport { throttle } from 'lodash-unified'\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 { data } from '@map-sdk/sdk/plugins/AreaView/layer/SeaRouteSymbolData'\nimport type { AreaViewBaseOptions } from '@map-sdk/sdk/plugins/AreaView/AreaViewBase'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\nclass SeaRouteSymbol extends AreaViewBase {\n  _tempAreaArray: L.Layer[] = []\n  lyGroup: L.LayerGroup | null = null\n  isShow = false\n  hash: { [name: string]: any } = {}\n  hashSD: { [name: string]: any } = {}\n  layerHash: { [name: string]: any } = {}\n  layerHashName: { [name: string]: any } = {}\n  textLayers: any[] = []\n  textZoom: number[] = [8, 18]\n  isInit = true\n  _zoomend = false\n  data2: { [key: string]: any } = data.data2\n  data: {\n    point: number\n    lat: number\n    lng: number\n    name: string\n    split: number[]\n    distance: number\n    isSpec?: boolean\n  }[] = data.data\n  pendingUpdates = false\n\n  constructor(map: MyMap, options?: Partial<AreaViewBaseOptions>) {\n    super(map, { minzoom: 2, maxzoom: 18, ...options })\n    this._data = this.data2\n    this.data.forEach((item) => {\n      const point: [number, number] = [item.lat, item.lng]\n      if (this.hash[item.name]) {\n        this.hash[item.name].points.push(point)\n      } else {\n        this.hash[item.name] = {\n          split: item.split || [],\n          name: item.name,\n          distance: item.distance / 2,\n          points: [point],\n          isSpec: !!item.isSpec,\n        }\n      }\n    })\n\n    Object.values(this.hash).forEach((o) => {\n      const collection: GeoJSON.Feature<GeoJSON.LineString> = lineString(\n        o.points.map((p: any[]) => [p[1], p[0]])\n      )\n      const feature: GeoJSON.Feature<GeoJSON.Polygon> = buffer(\n        collection as any,\n        o.distance,\n        'nauticalmiles'\n      )\n      const arr: number[][] = []\n      let split: number[] = o.split\n      feature.geometry.coordinates[0].forEach((item: any, i: number) => {\n        split = o.split\n        if (!split.includes(i)) {\n          let temp = item\n          if (o.isSpec) {\n            if (i === 0 || i === 6) {\n              temp = [120.26754740043194, 36.04663280221668]\n            }\n            if (i === 2) {\n              temp = [120.26078763753424, 36.02225510441438]\n            }\n          }\n          arr.push(temp)\n        }\n      })\n      feature.geometry.coordinates[0] = arr\n      o.feature = feature\n    })\n\n    map.on(\n      'moveend',\n      throttle(() => {\n        if (this.lyGroup && !this.pendingUpdates) {\n          this.pendingUpdates = true\n          this.lyGroup.eachLayer((ly: any) => {\n            if (ly && ly._type === 'line') {\n              this.setText(ly)\n            }\n          })\n          this.pendingUpdates = false\n        }\n      }, 1000)\n    )\n\n    this.polyNameChange()\n    this.isInit = true\n  }\n\n  _show() {\n    Object.values(this.hash).forEach((item) => {\n      this.showRoute(item)\n    })\n    this.showNormalPoly()\n    this.isShow = true\n    this.bounds && this.isInit && this._map.fitBounds(this.bounds as any)\n    this.isInit = false\n  }\n  _hide() {\n    try {\n      this.isShow = false\n      this.lyGroup && this.lyGroup.clearLayers()\n      const layerHashNames = Object.keys(this.layerHashName).filter(\n        (item) => !!this.layerHashName[item]\n      )\n      for (const item of layerHashNames) {\n        if (this._map.hasLayer(this.layerHashName[item]))\n          this._map.removeLayer(this.layerHashName[item])\n        delete this.layerHashName[item]\n      }\n      for (const item in this.layerHash) {\n        this._map.removeLayer(this.layerHash[item])\n        delete this.layerHash[item]\n      }\n      this._map.off('zoomend', this._EventZoomEnd)\n    } catch (e) {\n      console.log(e)\n    }\n  }\n  showName(p: any, name = '') {\n    const color = this._map.mapType != 'MT_SATELLITE' ? '#2161c0' : '#fff'\n    const zoom = this._map.getZoom()\n    if (p.getLatLngs()[0].length == 2) {\n      if (p._textNode) {\n        p._text = ''\n        p._textNode.remove()\n        p._textNode = null\n      }\n      if (zoom > this.textZoom[0] && zoom < this.textZoom[1]) {\n        p.redraw()\n        p.setText(name, {\n          repeat: false,\n          offset: -7,\n          center: false, //居中\n          attributes: {\n            fill: color,\n            //'font-weight': '600',\n            'font-size': '11',\n            //'font-family': \"微软雅黑\",\n            'letter-spacing': '4px',\n          },\n        })\n      }\n      return\n    }\n\n    return CommUtils.getFeatureLabel(p, name, {\n      offset: 0,\n      attributes: {\n        fill: color,\n        fontSize: '11',\n        xShift: 0,\n        fontFamily: '微软雅黑',\n      },\n    })\n  }\n  //调整区域名称偏移\n  getDescriptOffset() {\n    const offset = {\n      X: 10,\n      Y: 0,\n    }\n    return offset\n  }\n  private _EventZoomEnd = () => {\n    this._zoomend = true\n  }\n  ///\n  //  区域名称绘制逻辑\n  //  1:当前可视范围内区域名称重绘\n  //  2:处于编辑的区域屏蔽展示\n  //  3:事件调整 缩放执行延迟添加\n  ///\n  polyNameChange() {\n    this._map.on('zoomend', this._EventZoomEnd)\n\n    this._map.on('moveend', () => {\n      this._tempAreaArray = []\n      for (const item in this.layerHashName) {\n        const ly = this.layerHashName[item]\n        ly && this._map.removeLayer(ly)\n\n        if (this.layerHash[item]) {\n          const lbounds = this.layerHash[item].getBounds()\n          if (lbounds.isValid() && this._map.getBounds().intersects(lbounds)) {\n            this.layerHashName[item] = this.showName(this.layerHash[item], item)\n            // 缩放延迟执行添加\n            if (!this._zoomend) {\n              this.layerHashName[item] &&\n                this._map.addLayer(this.layerHashName[item])\n            } else {\n              this._tempAreaArray.push(this.layerHashName[item])\n            }\n          }\n        }\n      }\n\n      // 延迟绘制\n      setTimeout(() => {\n        this._tempAreaArray.forEach((item: L.Layer) => {\n          item && this._map.addLayer(item)\n        })\n      }, 0)\n      this._zoomend = false\n    })\n  }\n  showNormalPoly() {\n    Object.keys(this.data2).forEach((key) => {\n      //处理只有两个点的情况\n      const latLngs = this.data2[key].map((c: L.LatLngExpression) => {\n        return CanvasShipUtils.GPSEncryptByMapToLatLng(c, this._map)\n      })\n      const poly = L.polygon(latLngs, {\n        fillOpacity: 0.2,\n        opacity: 0.4,\n        weight: 1,\n        fillColor: '#b65aa3',\n        color: '#b65aa3',\n      }) as any\n      poly._type = 'poly2'\n      this.layerHash[key] = poly\n      this._map.addLayer(poly)\n      // 只有在合适的缩放级别才添加文本标注\n      this.layerHashName[key] = this.showName(poly, key)\n      this.layerHashName[key] && this._map.addLayer(this.layerHashName[key])\n    })\n  }\n  showRoute(o: any) {\n    if (!this.lyGroup) this.lyGroup = L.layerGroup().addTo(this._map)\n    this.bounds = this.bounds.concat(o.points)\n    //绘制线段 多段绘制\n    o.points.forEach((p: number[], i: number) => {\n      const next = o.points[i + 1]\n      if (next) {\n        let p1 = L.latLng(p[0], p[1])\n        let next1 = L.latLng(next[0], next[1])\n        p1 = CanvasShipUtils.GPSEncryptByMapToLatLng(p1, this._map)\n        next1 = CanvasShipUtils.GPSEncryptByMapToLatLng(next1, this._map)\n        const lls = [p1, next1]\n        const angle = CanvasShipUtils.getAngleByLatLngToBigCircle(\n          {\n            lat: p1.lat,\n            lng: p1.lng,\n          },\n          {\n            lat: next1.lat,\n            lng: next1.lng,\n          }\n        )\n        if (angle > 180) lls.reverse()\n        const polyLine = L.polyline(lls, {\n          dashArray: [6, 6],\n          weight: 2,\n          opacity: 0.9,\n          color: this.setLineColor(),\n        }) as any\n        polyLine._type = 'line'\n        polyLine.idx = i\n        polyLine._name = o.name\n        polyLine._mapType = this._map.getMapType()\n        polyLine._center = true\n\n        //只绘制偶数段\n        //if (i % 2 == 0) setText(polyLine);\n        this.lyGroup && this.lyGroup.addLayer(polyLine)\n      }\n    })\n    //\n\n    const feature = o.feature\n    feature.geometry.coordinates = o.feature.geometry.coordinates.map(\n      (coordinate: any[]) => {\n        return coordinate.map((lngLat) => {\n          const latLng = CanvasShipUtils.GPSEncryptByMapToLatLng(\n            [lngLat[1], lngLat[0]],\n            this._map\n          )\n          return [latLng.lng, latLng.lat]\n        })\n      }\n    )\n    const poly = L.geoJSON(feature, {\n      fillOpacity: 0.2,\n      opacity: 0.4,\n      weight: 1,\n      fillColor: '#b65aa3',\n      color: '#b65aa3',\n    } as any) as any\n    poly._type = 'poly'\n    this.lyGroup.addLayer(poly)\n  }\n  setLineColor() {\n    if (this._map.getMapType() == 'MT_SATELLITE') return '#92b2cb'\n    return '#628cd9'\n  }\n  setText(polyLine: any) {\n    const setTextColor = () => {\n      if (this._map.getMapType() == 'MT_SATELLITE') return '#fff'\n      return '#2161c0'\n    }\n    const textColor = setTextColor()\n    const lineColor = this.setLineColor()\n\n    if (polyLine.options.color != lineColor) {\n      polyLine && polyLine.setStyle({ color: lineColor })\n      if (polyLine.idx % 4 == 0) {\n        polyLine._textOptions &&\n          polyLine._textOptions.attributes &&\n          (polyLine._textOptions.attributes.fill = textColor)\n        polyLine._textRedraw()\n      }\n      return\n    }\n    const zoom = this._map.getZoom()\n\n    if (zoom > this.textZoom[0] && zoom < this.textZoom[1]) {\n      if (polyLine.idx % 4 == 0 && polyLine._text != polyLine._name) {\n        polyLine.setText(polyLine._name, {\n          repeat: false,\n          offset: -7,\n          center: polyLine._center, //居中\n          attributes: {\n            fill: textColor,\n            //'font-weight': '600',\n            'font-size': '11',\n            //'font-family': \"微软雅黑\",\n            'letter-spacing': '4px',\n          },\n        })\n      }\n    } else {\n      if (polyLine._textNode) {\n        polyLine._text = ''\n        polyLine._textNode.remove()\n        polyLine._textNode = null\n      }\n    }\n  }\n}\n\nconst seaRouteSymbol = (map: MyMap, options?: Partial<AreaViewBaseOptions>) =>\n  new SeaRouteSymbol(map, options)\n\nexport { SeaRouteSymbol, seaRouteSymbol }\n"],"names":["d","N","constructor","t","a","super","minzoom","maxzoom","this","_tempAreaArray","lyGroup","isShow","hash","hashSD","layerHash","layerHashName","textLayers","textZoom","isInit","_zoomend","data2","u","data","pendingUpdates","_EventZoomEnd","_data","forEach","e","s","lat","lng","name","points","push","split","distance","isSpec","Object","values","g","map","i","o","_","r","n","geometry","coordinates","h","includes","y","feature","on","x","eachLayer","_type","setText","polyNameChange","_show","showRoute","showNormalPoly","bounds","_map","fitBounds","_hide","clearLayers","keys","filter","hasLayer","removeLayer","off","showName","mapType","getZoom","getLatLngs","length","_textNode","_text","remove","redraw","repeat","offset","center","attributes","fill","b","getFeatureLabel","fontSize","xShift","fontFamily","getDescriptOffset","X","Y","getBounds","isValid","intersects","addLayer","setTimeout","p","GPSEncryptByMapToLatLng","m","polygon","fillOpacity","opacity","weight","fillColor","color","layerGroup","addTo","concat","latLng","getAngleByLatLngToBigCircle","reverse","l","polyline","dashArray","setLineColor","idx","_name","_mapType","getMapType","_center","geoJSON","options","setStyle","_textOptions","_textRedraw","L","f","c"],"mappings":"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"}