{"version":3,"file":"TrackSymbolImpl.mjs","sources":["../../../../../../packages/sdk/plugins/Trackplayer/TrackSymbolImpl.ts"],"sourcesContent":["import { toRaw } from 'vue'\nimport L from 'leaflet'\nimport { clone, find, findIndex, sortBy } from 'lodash-unified'\n// @ts-ignore: 7016\nimport leafletPolycolor from 'leaflet-polycolor'\nimport { type MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { GPS } from '@map-sdk/sdk/utils/GPS'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { Douglas } from '@map-sdk/sdk/utils/Douglas'\nimport { ShipxyOptions } from '@map-sdk/sdk/config'\nimport 'leaflet-polylinedecorator'\nimport 'leaflet-textpath'\nleafletPolycolor(L)\n\nconst layer = {\n  //轨迹的路线对象\n  route: null as any, // Leaflet.LayerGroup\n}\n\n/**\n * 箭头延伸\n */\nconst ArrowHeadExtend = L.Symbol.ArrowHead.extend({\n  _buildArrowPath(layer: any, point: any) {\n    const degToRad = Math.PI / 180\n    const projectedPoint = point.project(layer.latLng)\n    const angleInRadians = -(layer.heading - 90) * degToRad\n    const halfHeadAngle = (this.options.headAngle / 2) * degToRad\n    const angle1 = angleInRadians + halfHeadAngle\n    const angle2 = angleInRadians - halfHeadAngle\n    const p1 = new L.Point(\n      projectedPoint.x - this.options.pixelSize * Math.cos(angle1),\n      projectedPoint.y + this.options.pixelSize * Math.sin(angle1)\n    )\n    const p2 = new L.Point(\n      projectedPoint.x - this.options.pixelSize * Math.cos(angle2),\n      projectedPoint.y + this.options.pixelSize * Math.sin(angle2)\n    )\n    const p3 = new L.Point(\n      p1.x - 0.5 * (p1.x - p2.x),\n      p1.y - 0.5 * (p1.y - p2.y)\n    )\n    const p4 = new L.Point(\n      p3.x - 0.3 * (p3.x - projectedPoint.x),\n      p3.y - 0.3 * (p3.y - projectedPoint.y)\n    )\n    return [\n      point.unproject(p4),\n      point.unproject(p1),\n      layer.latLng,\n      point.unproject(p2),\n    ]\n  },\n})\n\nconst arrowHeadExtend = (map: any) => new ArrowHeadExtend(map)\ninterface DataObj {\n  diluteMaxCount: any\n  trackid: string\n  lineColor?: string\n  lineWeight?: number\n  dash?: boolean\n  dashArray?: number[]\n  circleOverColor?: string\n  textColor?: string\n  emission?: any //\n  emissionShow?: boolean\n  aiDetection?: any\n  aiDetectionShow?: boolean\n  startShow?: boolean\n  endShow?: boolean\n  middleShow?: boolean\n  stopShow?: boolean\n  slowShow: boolean\n  suspectStopShow: boolean\n  directionShow?: boolean\n  isShowLable?: boolean\n  isOpenMathColor?: boolean\n  isShowTip?: boolean\n  isShowLineHover?: boolean\n  lableFields?: string[]\n  showTimeType?: string[]\n  tipHideTimeOut?: number\n  notDiluteZoom?: any[] //\n  isDilute: boolean\n  isDiluteType?: number\n  startCircleType?: number\n  endCircleType?: number\n  startCircleColor?: string\n  endCircleColor?: string\n  circleColor?: string\n  circleFillColor?: string\n  circleLowSogColor?: string\n  circleLowSogFillColor?: string\n  startImg?: string\n  endImg?: string\n  stopImg?: string\n  slowImg?: string\n  suspectStopImg?: string\n  analysisResult?: any //\n  trackLangCount: number\n  pointClick?: (...params: any) => void\n  pointIconClick?: (...params: any) => void\n  lableMap: { [key: string]: string }\n  arcMin?: number\n  zIndex: number\n}\n\nclass TrackSymbolImpl {\n  // 唯一标识一条轨迹\n  trackid: string\n  //轨迹的各个点或段的数据\n  tracks: any[]\n  //与轨迹相关的船只或对象的数据\n  ship: any\n  //地图对象\n  map: any\n  //是否是新轨迹\n  trackNew: boolean\n  //是否显示轨迹\n  isShowTrack: boolean\n  //绘制轨迹的画布对象\n  canvas_track: any\n  //属性控制轨迹线条的颜色、粗细、是否虚线以及虚线的样式\n  lineColor: string\n  lineWeight: number\n  dash: boolean\n  dashArray: number[]\n  //控制轨迹上的点被覆盖时的颜色和文本颜色\n  circleOverColor: string\n  textColor: string\n  //轨迹点的排放数据\n  emission: any\n  //控制是否显示排放数据\n  emissionShow: boolean\n  // ai 检测叠加图层展示\n  aiDetection: any\n  aiDetectionShow: boolean\n  // 鼠标悬浮点击颜色\n  aiActivityColor: string\n  //控制是否在轨迹上显示起点、终点、中间点、停止点、慢行点和可疑停止点\n  startShow: boolean\n  endShow: boolean\n  middleShow: boolean\n  stopShow: boolean\n  slowShow: boolean\n  suspectStopShow: boolean\n  //是否显示方向指示\n  directionShow: boolean\n  // 是否开启随机线条颜色\n  isOpenMathColor: boolean\n  //控制是否显示标签和提示信息\n  isShowLable: boolean\n  isShowTip: boolean\n  //是否显示轨迹点的悬浮事件\n  isShowLineHover: boolean\n  //定义了哪些字段将显示为标签\n  lableFields: string[]\n  //定义了显示时间的类型\n  showTimeType: string[]\n  //提示信息隐藏的超时时间\n  tipHideTimeOut: number\n  //定义了在哪些缩放级别下不稀释轨迹点\n  notDiluteZoom: any[]\n  //控制是否稀释轨迹点以优化显示\n  isDilute = true\n  //定义了稀释的类型\n  isDiluteType: number\n  //分别定义起点和终点的圆圈类型\n  startCircleType?: number\n  endCircleType: number\n  startCircleColor: string\n  endCircleColor: string\n  circleColor: string\n  circleFillColor: string\n  circleLowSogColor: string\n  circleLowSogFillColor: string\n  //定义了不同状态下的图标\n  startImg: string\n  endImg: string\n  stopImg: string\n  slowImg: string\n  suspectStopImg: string\n  //分析结果的数据\n  analysisResult: any\n  //之前缩放级别和经纬度\n  preZoom: number\n  preLatlng: any\n\n  //轨迹的经度\n  tracklang: number\n  //标签缓存数组\n  labelCache: any[]\n  //点击轨迹点或图标时的回调函数\n  pointClick: any\n  pointIconClick: any\n  //用于存储标签的映射\n  lableMap: { [key: string]: string }\n  //弧线的最小值\n  arcMin: number\n  //控制图层的堆叠顺序\n  zIndex: number\n  //可能用于显示HTML文本的模板\n  showHtml_txt_templater: any\n  //鼠标提示对象\n  mouseTip: any\n  // 地图的实例。\n  _map: MyMap\n  //分析结果搜索数组\n  _analysisResultSearch: any[]\n  //鼠标提示的定时器\n  mouseTipTimer: any\n  //稀释时的最大点数\n  diluteMaxCount: any\n  //稀释数据的缓存记录\n  diluteDataCache: Record<string, any>\n  //稀释ai数据的缓存记录\n  aiDataCache: Record<string, any> = {}\n\n  // 存储老的坐标点长度\n  oldTrackLength = 0\n  oldAiLength = 0\n\n  constructor(map: MyMap, tracks: any[], ship: any, dataObj: DataObj) {\n    console.log(dataObj, 'dataObj')\n    this.trackid = dataObj.trackid\n    this.tracks = tracks\n    this.oldTrackLength = tracks.length\n    this.ship = ship\n    this._map = map\n    this._map.canvas_track = this._map.canvas_track || L.canvas()\n    this.trackNew = true\n    this.isShowTrack = true\n    this.lineColor = dataObj.lineColor || '#993333'\n    this.lineWeight = dataObj.lineWeight || 1\n    this.dash = dataObj.dash || false\n    this.dashArray = dataObj.dashArray || [5, 5]\n    this.circleOverColor = dataObj.circleOverColor || '#FC0E0E'\n    this.textColor = dataObj.textColor || '#000'\n    this.emission = !dataObj.emission ? null : dataObj.emission\n    this.emissionShow = dataObj.emission\n    this.aiDetection = !dataObj.aiDetection ? null : dataObj.aiDetection\n    this.aiDetectionShow = dataObj.aiDetection\n    this.aiActivityColor = dataObj.aiDetection?.activityColor || '#f70006'\n    this.oldAiLength = dataObj.aiDetection?.datas?.length || 0\n    this.startShow = dataObj.startShow ?? true\n    this.endShow = dataObj.endShow ?? true\n    this.middleShow = dataObj.middleShow ?? true\n    this.stopShow = dataObj.stopShow ?? true\n    this.slowShow = dataObj.slowShow ?? true\n    this.suspectStopShow = dataObj.suspectStopShow && dataObj.slowShow\n    this.directionShow = dataObj.directionShow ?? true\n    this.isShowLable = dataObj.isShowLable ?? true\n    this.isOpenMathColor = dataObj.isOpenMathColor ?? false\n    this.isShowTip = dataObj.isShowTip ?? true\n    this.isShowLineHover = dataObj.isShowLineHover ?? false\n    this.lableFields = dataObj.lableFields || [\n      'name',\n      'mmsi',\n      'sog',\n      'cog',\n      'utc',\n      'kn',\n    ]\n    this.showTimeType = dataObj.showTimeType || []\n    this.tipHideTimeOut = dataObj.tipHideTimeOut || 2000\n    this.notDiluteZoom = dataObj.notDiluteZoom || []\n    this.isDilute = dataObj.isDilute == null || dataObj.isDilute\n    this.isDiluteType = dataObj.isDiluteType || 1\n    this.diluteDataCache = {}\n    this.aiDataCache = {}\n    this.diluteMaxCount = dataObj.diluteMaxCount || 300\n    this.startCircleType = dataObj.startCircleType || 1\n    this.endCircleType = dataObj.endCircleType || 1\n    this.startCircleColor = dataObj.startCircleColor || '#06c84a'\n    this.endCircleColor = dataObj.endCircleColor || '#f70006'\n    this.circleColor = dataObj.circleColor || this.lineColor || '#993333'\n    this.circleFillColor = dataObj.circleFillColor || '#fff'\n    this.circleLowSogColor = dataObj.circleLowSogColor || '#993333'\n    this.circleLowSogFillColor = dataObj.circleLowSogFillColor || '#fff'\n    this.startImg = dataObj.startImg || ShipxyOptions.data_img.track_star\n    this.endImg = dataObj.endImg || ShipxyOptions.data_img.track_end\n    this.stopImg = dataObj.stopImg || ShipxyOptions.data_img.track_stop\n    this.slowImg = dataObj.slowImg || ShipxyOptions.data_img.track_slow\n    this.suspectStopImg =\n      dataObj.suspectStopImg || ShipxyOptions.data_img.track_suspectStop\n    this.analysisResult = Object.assign(\n      {\n        stops: [],\n        slows: [],\n        suspectStops: [],\n      },\n      dataObj.analysisResult\n    )\n    this.preZoom = 0\n    this.preLatlng = {}\n    this.tracklang = dataObj.trackLangCount\n    this.labelCache = []\n    this.pointClick = dataObj.pointClick\n    this.pointIconClick = dataObj.pointIconClick\n    this.lableMap = dataObj.lableMap\n    this.arcMin = dataObj.arcMin || 300\n    this.zIndex = dataObj.zIndex\n    this._analysisResultSearch = []\n    this.showHtml_txt_templater = {\n      name: `船名：{1}<br/>`,\n      mmsi: `MMSI：{1}<br/>`,\n      sog: `航速：{1}节<br/>`,\n      cog: `航迹向：{1}度<br/>`,\n      utc: `时间：{1}<br/>`,\n      kn: `距离起点：{1}海里<br/>`,\n      ed: `距离终点：{1}海里<br/>`,\n      md: `下一段航程：{1}海里<br/>`,\n      draught: `吃水：{1}米<br/>`,\n      dest: `目的地：{1}<br/>`,\n      eta: `预到时间：{1}<br/>`,\n      navistatus: `状态：{1}<br/>`,\n      rot: `旋转角速度：{1}度/秒<br/>`,\n      hdg: `航首向：{1}度<br/>`,\n      lat: `纬度：{1}<br/>`,\n      lng: `经度：{1}<br/>`,\n      sog2: `两点航速：{1}节<br/>`,\n      co2: `累计碳排放：{1}吨<br/>`,\n    }\n    this.mouseTip = {\n      show(\n        event: { originalEvent: any },\n        content: any,\n        offsetX: any,\n        offsetY: any,\n        defaultOffsetY: any,\n        width: any\n      ) {\n        let legendElement = this._tooltipLegend\n\n        if (!legendElement) {\n          legendElement = L.DomUtil.create(\n            'div',\n            'track_mouse_tip',\n            document.body\n          )\n          legendElement.style.zIndex = '1000'\n\n          L.DomUtil.create(\n            'div',\n            'one',\n            legendElement\n          ).style.width = `${width}px`\n          this._tooltipLegend = legendElement\n        }\n\n        const mousePosition = this.getMousePos(event.originalEvent)\n\n        legendElement.style.left = `${mousePosition.x + (offsetX || 0)}px`\n        legendElement.style.top = `${mousePosition.y + (offsetY || 5)}px`\n\n        legendElement.childNodes[0].innerHTML = content\n        legendElement.style.display = 'block'\n      },\n\n      hide() {\n        if (this._tooltipLegend) {\n          this._tooltipLegend.style.display = 'none'\n        }\n      },\n\n      getMousePos(event: any) {\n        const originalEvent = window.event || event,\n          docScrollLeft =\n            document.documentElement.scrollLeft || document.body.scrollLeft,\n          docScrollTop =\n            document.documentElement.scrollTop || document.body.scrollTop\n\n        return {\n          x: originalEvent.pageX || originalEvent.clientX + docScrollLeft,\n          y: originalEvent.pageY || originalEvent.clientY + docScrollTop,\n        }\n      },\n    }\n  }\n  private _Event = {\n    moveend: () => this.showTrack(),\n    baselayerchange: () => this._on_baselayerchange,\n  }\n  show() {\n    if (this) {\n      this._map.off('moveend', this._Event.moveend)\n      this.isShowTrack = true\n      this.showTrack()\n      this._map.on('moveend', this._Event.moveend)\n      this._map.on('baselayerchange', this._Event.baselayerchange)\n    }\n  }\n  hide() {\n    this.isShowTrack = false\n    this.removeTrack()\n  }\n  setZIndex(zIndex: any) {\n    if (this._map.canvas_track && this._map.canvas_track._container) {\n      this._map.canvas_track._container.style.zIndex = zIndex\n      return\n    }\n    console.error('canvas_track is null')\n  }\n  removeTrack() {\n    if (layer.route) {\n      layer.route.clearLayers()\n      layer.route.remove()\n      layer.route = null\n      this.tracks = []\n      if (this.aiDetection?.datas) this.aiDetection.datas = []\n      this.oldTrackLength = 0\n      this.oldAiLength = 0\n      this.isShowTrack = false\n    }\n    this._map.off('moveend', this.showTrack, this)\n  }\n  /**航线绘制,只读模态展示， */\n  showTrack() {\n    let startTime = Date.now()\n\n    // 初始化标签缓存和路线图层\n    this.labelCache.length = 0\n    layer.route\n      ? layer.route.clearLayers()\n      : (layer.route = L.featureGroup().addTo(this._map))\n\n    // 如果没有轨迹数据或者轨迹显示未开启，则不执行\n    if (this.isShowTrack && this.tracks.length > 0) {\n      // 计算绘制轨迹的点\n      const processedData = this.calcProcessedData()\n      // 显示ai检测船舶数据\n      if (this.aiDetectionShow && this.aiDetection.show && this.oldAiLength) {\n        this._showTrackAi(processedData)\n      }\n      this.drawLine(processedData)\n      startTime = Date.now() - startTime\n      console.log('showTrack 耗时：', startTime)\n    }\n  }\n\n  /**\n   * 绘制航线\n   * @param processedData\n   */\n  drawLine(processedData: any[]) {\n    // 遍历处理后的轨迹点\n    for (let i = 0; i < processedData.length; i++) {\n      let currentSegment: any = null\n      let directionDecorator = null\n      let directionDistance = 0\n      const currentDataPoint = processedData[i]\n      const nextDataPoint = processedData[i + 1]\n      // TODO: 多段不同颜色表示不同的气象等信息\n      const lineColor = [\n        '#9C27B0',\n        '#0d61be',\n        '#008a3e',\n        '#b71b61',\n        '#c5912e',\n        '#69f',\n        '#f00',\n        '#2770d4',\n        '#E91E63',\n        '#00BCD4',\n      ]\n      const colorDraw = this.isOpenMathColor\n        ? lineColor[Math.floor(Math.random() * lineColor.length)]\n        : this.lineColor\n      // 如果存在连续点，则绘制轨迹线和相关装饰\n      if (i + 1 !== processedData.length) {\n        if (currentDataPoint.join === false) continue\n        let segmentPoints: L.LatLngExpression[] = [\n          [currentDataPoint.lat, currentDataPoint.lng],\n          [nextDataPoint.lat, nextDataPoint.lng],\n        ]\n        let startPoint = segmentPoints[0]\n        let endPoint = segmentPoints[1]\n        const startPointLayer = this._map.latLngToLayerPoint(\n          L.latLng(currentDataPoint.lat, currentDataPoint.lng)\n        )\n        let midPointLayer = this._map.latLngToLayerPoint(\n          L.latLngBounds(\n            L.latLng(currentDataPoint.lat, currentDataPoint.lng),\n            L.latLng(nextDataPoint.lat, nextDataPoint.lng)\n          ).getCenter()\n        )\n        let segmentDistance = currentDataPoint.md\n\n        Math.abs(currentDataPoint.index - nextDataPoint.index) !== 1 &&\n          (segmentDistance = CanvasShipUtils.getDistance(\n            [currentDataPoint.lat, currentDataPoint.lng],\n            [nextDataPoint.lat, nextDataPoint.lng],\n            'mn'\n          ))\n        if (segmentDistance >= this.arcMin) {\n          segmentPoints = L.Control.PolylineMeasure.prototype._polylineArc(\n            L.latLng([currentDataPoint.lat, currentDataPoint.lng]),\n            L.latLng([nextDataPoint.lat, nextDataPoint.lng])\n          ) as L.LatLngExpression[]\n          const midIndex = segmentPoints.length / 2\n          midPointLayer = this._map.latLngToLayerPoint(segmentPoints[midIndex])\n          startPoint = segmentPoints[midIndex]\n          endPoint = segmentPoints[midIndex + 1]\n        }\n\n        // 绘制轨迹线段\n        currentSegment = L.polyline(segmentPoints, {\n          renderer: this._map.canvas_track,\n          color: colorDraw,\n          weight: this.lineWeight,\n          opacity: 1,\n          dashArray: this.dash ? this.dashArray : '0',\n        })\n\n        directionDistance = startPointLayer.distanceTo(midPointLayer) + 5\n        // 绘制方向指示箭头\n        if (this.directionShow) {\n          directionDecorator = L.polylineDecorator(\n            [startPoint, endPoint] as any,\n            {\n              patterns: [\n                {\n                  offset: directionDistance,\n                  symbol: arrowHeadExtend({\n                    pixelSize: 15,\n                    headAngle: 40,\n                    pathOptions: {\n                      renderer: this._map.canvas_track,\n                      fillOpacity: 1,\n                      weight: 0,\n                      color: colorDraw,\n                    },\n                  }),\n                },\n              ],\n            }\n          )\n        }\n\n        if (directionDecorator) layer.route.addLayer(directionDecorator)\n        if (currentSegment) layer.route.addLayer(currentSegment)\n        if (currentSegment && this.isShowLineHover) {\n          currentSegment\n            .on(\n              'mouseover',\n              (e: {\n                latlng: L.LatLngExpression\n                target: { options: { index: number } }\n              }) => {\n                currentSegment.setStyle({ weight: '3' })\n                // 可以在这里添加其他的交互，比如显示一个弹窗\n                L.popup({\n                  closeButton: false,\n                  className: 'track-popup',\n                })\n                  .setLatLng(e.latlng)\n                  .setContent(\n                    this.showHtml(\n                      processedData[e.target.options.index - 1],\n                      processedData[e.target.options.index]\n                    )\n                  )\n                  .openOn(toRaw(this._map))\n              }\n            )\n            .on('mouseout', () => {\n              // this.setStyle({ color: 'blue' })\n              currentSegment.setStyle({ weight: '1' })\n              // 关闭弹窗或者做其他的清理工作\n              this._map.closePopup()\n            })\n        }\n      }\n      const isShowLab = currentDataPoint.isShowMarker ?? true\n      // 绘制标签\n      if (this.isShowLable && isShowLab) {\n        const direction = this.getLineDir(currentDataPoint, nextDataPoint)\n        let timeStr =\n          (currentDataPoint.from === 1 || currentDataPoint.from === 2\n            ? ' '\n            : '') + CommUtils.dataFormat(currentDataPoint.utc * 1000)\n        let labelStr = ''\n\n        if (this.lableMap && this.lableMap[`${currentDataPoint.utc * 1000}`]) {\n          labelStr = ` ${this.lableMap[`${currentDataPoint.utc * 1000}`]}`\n        }\n        timeStr += labelStr\n\n        const labelLength = Math.max(\n          CanvasShipUtils.calcStrLength(\n            this._map,\n            timeStr,\n            '600 15px \"Microsoft Yahei\",Arial'\n          ),\n          165\n        )\n        const labelPath1 = this.getTrackLabelPath1(\n          {\n            lat: currentDataPoint.lat,\n            lng: currentDataPoint.lng,\n          },\n          direction\n        )\n        const labelPath2 = this.getTrackLabelPath2(\n          {\n            lat: currentDataPoint.lat,\n            lng: currentDataPoint.lng,\n          },\n          currentDataPoint.from === 1 || currentDataPoint.from === 2\n            ? labelLength + 12\n            : labelLength,\n          direction\n        )\n        // 判断是否显示标牌\n        if (this.addTrackManager(labelPath2)) {\n          const labelPolyline = L.polyline(labelPath1 as any, {\n            renderer: this._map.canvas_track,\n            fillColor: '#fff',\n            fillOpacity: 1,\n            color: colorDraw,\n            weight: 1,\n            opacity: 0.7,\n          })\n          const labelPoints = []\n          const labelStartPoint = this._map.latLngToContainerPoint(\n            labelPath2[0] as any\n          )\n          const labelEndPoint = this._map.latLngToContainerPoint(\n            labelPath2[1] as any\n          )\n\n          labelPoints.push(\n            this._map.containerPointToLatLng(\n              L.point(labelStartPoint.x, labelStartPoint.y - 8)\n            ),\n            this._map.containerPointToLatLng(\n              L.point(labelEndPoint.x + 4, labelEndPoint.y - 8)\n            ),\n            this._map.containerPointToLatLng(\n              L.point(labelEndPoint.x + 4, labelEndPoint.y + 8)\n            ),\n            this._map.containerPointToLatLng(\n              L.point(labelStartPoint.x, labelStartPoint.y + 8)\n            )\n          )\n\n          const labelBackground = L.polygon(labelPoints, {\n            fillColor: '#fff',\n            fillOpacity: 0.5,\n            color: colorDraw,\n            weight: 1,\n            opacity: 1,\n            lineCap: 'butt',\n            lineJoin: 'bevel',\n          }) as any\n          //\n          labelBackground.setText(timeStr, {\n            repeat: false,\n            offset: 12,\n            attributes: {\n              fill: this.textColor,\n              'font-weight': '100',\n              'font-size': '12px',\n              'font-family': 'Microsoft Yahei',\n              x: 8,\n            },\n          })\n\n          // 标签指示线条\n          layer.route.addLayer(labelPolyline)\n          // 标签显示样式及文字\n          layer.route.addLayer(labelBackground)\n\n          if (1 == currentDataPoint.from || 2 == currentDataPoint.from) {\n            const icon = {\n              iconUrl:\n                'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8wOS8xMlFnxgkAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzQGstOgAAABu0lEQVQokVWQvWtTYRjFf++HiSYk9epFDbaRVKHYOFTbIeJWd1Mqmdz8QOjgIDi4BYR2qw5u9rrppoN/QFcVMkmh6lDFj1IlH03S25jkvu/rEHrFMx14zo9zeIRzjsZCkeTV8pyt7zyz7dYFhgONc6B1JD1/Q/qn7mTurdQARL08TaI0fy3a+vha+ieVLkwhsh44i23VMd+/YBu/jC5MLWYfPn0j2o/uzpqvn9+r0wWlz8+AUqQqSxxo/+UTok8fMNvfInXmXEnanZ/PxeG0krkJXNglVVkiDJYJg2UAXG8fmcsjjqS1/b0daNtpFtX4JK4X4nohALbTAqD7+EHcJDJjmB9bRU2/r7AG1x6FOtXbZKtrsY8BIWA41NpZgwu7uEE/Pu7evw7A0dVXsccaMAYNRHa3qUUiCYAXrNO6NR/DB81uOMBZE2lMtOHCzgx/dBzygnUAmpWL/0ATAWyKxo3Lc67feycSSSVSaRCS/+Tc6CH9nhHJVEm6vXZN5cYXkTJCCOQxHz0xic6fRfonRtvBqFx+4fiLtzVRL08DcOjSlVnbagRur13EmtE+qSKRzmxKz785Vl2rAfwFbCvCZDdQ2CMAAAAASUVORK5CYII=',\n              iconAnchor: [-0x3, 0x6],\n            }\n            2 == currentDataPoint.from &&\n              (icon['iconUrl'] =\n                'data:image/png;base64,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')\n            layer.route.addLayer(\n              L.marker([labelPath1[1][0], labelPath1[1][1]], {\n                icon: L.icon(icon as any),\n              })\n            )\n          }\n        }\n      }\n      if (currentDataPoint.isStartLatLng || currentDataPoint.isEndLatLng) {\n        const icon = currentDataPoint.isStartLatLng\n          ? L.icon({\n              iconUrl: this.startImg,\n              iconAnchor: [15, 32],\n            })\n          : L.icon({\n              iconUrl: this.endImg,\n              iconAnchor: [16, 32],\n            })\n\n        const marker = L.marker([currentDataPoint.lat, currentDataPoint.lng], {\n          icon,\n          _data: {\n            type: currentDataPoint.isStartLatLng ? 'start' : 'end',\n            track: currentDataPoint,\n            trackid: this.trackid,\n          },\n        } as any)\n\n        if (\n          (currentDataPoint.isStartLatLng && this.startShow) ||\n          (currentDataPoint.isEndLatLng && this.endShow)\n        ) {\n          layer.route.addLayer(marker)\n          if (this.pointIconClick) {\n            marker.on('click', (event) => {\n              this.pointIconClick(event.target.options._data)\n            })\n          }\n        }\n\n        const circleOptions = {\n          renderer: this._map.canvas_track,\n          radius: 3,\n          weight: 2,\n          color: colorDraw,\n          old_color: colorDraw,\n          fill: true,\n          fillColor: currentDataPoint.isStartLatLng\n            ? this.startCircleColor\n            : this.endCircleColor,\n          fillOpacity: 1,\n          opacity: 1,\n          index: i,\n          trackid: this.trackid,\n        }\n\n        if (\n          (this.startCircleType != 0 && currentDataPoint.isStartLatLng) ||\n          (this.endCircleType != 0 && currentDataPoint.isEndLatLng)\n        ) {\n          if (\n            (this.startCircleType === 2 && currentDataPoint.isStartLatLng) ||\n            (this.endCircleType === 2 && currentDataPoint.isEndLatLng)\n          ) {\n            circleOptions.color = circleOptions.old_color = this.circleColor\n            circleOptions.fillColor = currentDataPoint.isStartLatLng\n              ? this.startCircleColor\n              : this.endCircleColor\n          } else {\n            circleOptions.radius = 8\n            circleOptions.fillColor = '#ddd'\n            circleOptions.fillOpacity = 0.5\n          }\n          const circleMarker = L.circleMarker(\n            [currentDataPoint.lat, currentDataPoint.lng],\n            circleOptions\n          )\n\n          if (this.isShowTip) {\n            circleMarker.on('mouseover', (event) => {\n              event.target.setStyle({\n                color: this.circleOverColor,\n              })\n\n              const prevPoint = processedData[event.target.options.index - 1],\n                nextPoint = processedData[event.target.options.index],\n                tooltipContent = this.showHtml(\n                  nextPoint,\n                  prevPoint,\n                  this.lableFields\n                )\n\n              this.mouseTip.show(event, tooltipContent, 13, 13, 0, 170)\n              setTimeout(() => {\n                this.mouseTip.hide()\n              }, this.tipHideTimeOut)\n            })\n            circleMarker.on('mouseout', (event) => {\n              event.target.setStyle({\n                color: event.target.options.old_color,\n              })\n              this.mouseTip.hide()\n            })\n          }\n\n          if (this.pointClick) {\n            circleMarker.on('click', (event) => {\n              const prevPoint = processedData[event.target.options.index - 1],\n                nextPoint = processedData[event.target.options.index],\n                clickData = this.showHtml_data(nextPoint, prevPoint)\n\n              setTimeout(() => {\n                this.pointClick(clickData, event.target.options.trackid)\n              }, 60)\n            })\n          }\n\n          layer.route.addLayer(circleMarker)\n        }\n      } else {\n        const analysisInfoChanged = currentDataPoint.analysisInfo\n          ? currentDataPoint.analysisInfo.type\n          : ''\n        const nextAnalysisInfoChanged = nextDataPoint.analysisInfo\n          ? nextDataPoint.analysisInfo.type\n          : ''\n        console.log(\n          analysisInfoChanged,\n          nextAnalysisInfoChanged,\n          'analysisInfoChanged'\n        )\n        // TODO:目前这里存在问题\n        if (this.middleShow) {\n          const middleCircleOptions = {\n            renderer: this._map.canvas_track,\n            radius: 3,\n            weight: 2,\n            color: this.circleColor,\n            old_color: this.circleColor,\n            fill: true,\n            fillColor: currentDataPoint.analysisInfo\n              ? this.circleLowSogFillColor\n              : this.circleFillColor,\n            fillOpacity: 1,\n            opacity: 1,\n            index: i,\n            trackid: this.trackid,\n          }\n\n          const middleCircleMarker = L.circleMarker(\n            [currentDataPoint.lat, currentDataPoint.lng],\n            middleCircleOptions\n          )\n\n          if (this.isShowTip) {\n            middleCircleMarker.on('mouseover', (event) => {\n              event.target.setStyle({\n                color: this.circleOverColor,\n              })\n\n              const prevPoint = processedData[event.target.options.index - 1],\n                nextPoint = processedData[event.target.options.index],\n                tooltipContent = this.showHtml(\n                  nextPoint,\n                  prevPoint,\n                  this.lableFields\n                )\n\n              this.mouseTip.show(event, tooltipContent, 13, 13, 0, 170)\n\n              clearTimeout(this.mouseTipTimer)\n              this.mouseTipTimer = setTimeout(() => {\n                this.mouseTip.hide()\n              }, this.tipHideTimeOut)\n            })\n            middleCircleMarker.on('mouseout', (event) => {\n              event.target.setStyle({\n                color: event.target.options.old_color,\n              })\n              this.mouseTip.hide()\n            })\n          }\n\n          if (this.pointClick) {\n            middleCircleMarker.on('click', (event) => {\n              const prevPoint = processedData[event.target.options.index - 1],\n                nextPoint = processedData[event.target.options.index],\n                clickData = this.showHtml_data(nextPoint, prevPoint)\n\n              setTimeout(() => {\n                this.pointClick(clickData, event.target.options.trackid)\n              }, 60)\n            })\n          }\n\n          layer.route.addLayer(middleCircleMarker)\n        }\n\n        // 绘制特殊状态标记，如停止、慢速、疑似停止\n        if (\n          currentDataPoint.analysisInfo &&\n          nextDataPoint &&\n          currentDataPoint.analysisInfo.type != nextDataPoint.analysisInfo?.type\n        ) {\n          let markerIconUrl = ''\n          if (this.stopShow && currentDataPoint.analysisInfo.type == 'stop') {\n            markerIconUrl = this.stopImg\n          } else if (\n            this.slowShow &&\n            currentDataPoint.analysisInfo.type == 'slow'\n          ) {\n            markerIconUrl = this.slowImg\n          } else if (\n            this.suspectStopShow &&\n            currentDataPoint.analysisInfo.type == 'suspectStop'\n          ) {\n            markerIconUrl = this.suspectStopImg\n          }\n\n          if (markerIconUrl) {\n            const markerIcon = L.icon({\n              iconUrl: markerIconUrl,\n              iconSize: [24, 34],\n              iconAnchor: [12, 34],\n            })\n            const marker = L.marker([nextDataPoint.lat, nextDataPoint.lng], {\n              icon: markerIcon,\n              _data: currentDataPoint.analysisInfo,\n            } as any)\n\n            if (\n              this.showTimeType.includes(currentDataPoint.analysisInfo.type)\n            ) {\n              const tooltipContent =\n                currentDataPoint.analysisInfo._stopMight ||\n                currentDataPoint.analysisInfo._time\n              marker\n                .bindTooltip(tooltipContent, {\n                  offset: L.point(-10, -22),\n                  direction: 'left',\n                  className: 'trackStopSlowClass',\n                  permanent: true,\n                  opacity: 1,\n                })\n                .openTooltip()\n            }\n\n            if (currentDataPoint.analysisInfo.type == 'suspectStop') {\n              marker.on('mouseover', (event) => {\n                const suspectStopInfo = event.target.options._data,\n                  timeStr = `间隔${suspectStopInfo._time\n                    .replace('d', '天')\n                    .replace('h', '时')\n                    .replace('m', '分')\n                    .replace('s', '秒')}，航行${suspectStopInfo.md.toFixed(\n                    1\n                  )}海里<br/>平均速度${suspectStopInfo.sogAvg}节<br/>合理速度${\n                    suspectStopInfo.sogMight\n                  }节<br/>疑似停靠${suspectStopInfo._stopMight\n                    .replace('d', '天')\n                    .replace('h', '时')\n                    .replace('m', '分')\n                    .replace('s', '秒')}`\n\n                this.mouseTip.show(event, timeStr, 13, 13, 0, 190)\n              })\n              marker.on('mouseout', () => {\n                this.mouseTip.hide()\n              })\n            }\n\n            if (this.pointIconClick) {\n              marker.on('click', (event) => {\n                this.pointIconClick(event.target.options._data)\n              })\n            }\n\n            layer.route.addLayer(marker)\n          }\n        }\n      }\n\n      // index++\n      // if (this.options.pointDrawEnd) {\n      //   this.options.pointDrawEnd(this.trackid, currentDataPoint)\n      // }\n    }\n  }\n\n  /**\n   * 坐标点稀疏、显示的点位信息\n   * @returns\n   */\n  calcProcessedData(tracks: any[] = this.tracks, isAppend = false) {\n    const trackLength = tracks.length\n    console.log(`抽稀前：${trackLength}`)\n    // 处理轨迹数据，包括抽稀和分析等\n    let processedData = this.dealWrapData(tracks, this.isDilute, isAppend)\n    // 计算抽稀后的点数量\n    const thinnedPointsLength = processedData.length\n    console.log(`抽稀后：${thinnedPointsLength}`)\n    // 显示排放数据，如果需要\n    if (this.emissionShow && this.emission.show) {\n      const emissionLayer = this._showTrackEmission(processedData)\n      emissionLayer && layer.route.addLayer(emissionLayer)\n      if (this.emission.arrawShow) {\n        const emissionArraw = L.polylineDecorator(emissionLayer as any, {\n          patterns: [\n            {\n              offset: 15, // 箭头起始位置\n              endOffset: 5,\n              repeat: 50, // 箭头重复间隔\n              symbol: arrowHeadExtend({\n                pixelSize: 20, // 箭头大小\n                polygon: true,\n                headAngle: 60, // 箭头角度\n                pathOptions: {\n                  fillOpacity: 0.5,\n                  weight: 0,\n                  color: this.emission.arrawColor,\n                },\n              }),\n            },\n          ],\n        })\n        emissionArraw && layer.route.addLayer(emissionArraw)\n      }\n    }\n\n    // 计算绘制轨迹的点\n    processedData = this._calcDrawTrackPoints(processedData)\n    return processedData\n  }\n\n  _calcDrawTrackPoints(trackPoints: any[]) {\n    const result = []\n\n    // 检查传入的点是否为空或者长度小于3，如果是，则直接返回处理后的点\n    if (!trackPoints || trackPoints.length < 3) {\n      return (trackPoints = trackPoints || []).map((point) => {\n        const newPoint = clone(point)\n        const latLng = this.getLatLng(newPoint)\n        newPoint.lat = latLng.lat\n        newPoint.lng = latLng.lng\n        return newPoint\n      })\n    }\n\n    // 遍历点集，进行处理\n    let prevIndex = -1\n    const bounds = this._map.getBounds()\n    const length = trackPoints.length\n    for (let i = 0; i < length; i++) {\n      const currentPoint = clone(trackPoints[i])\n      const latLng = this.getLatLng(currentPoint)\n      // 保存原始经纬度\n      currentPoint.latGPS = currentPoint.lat\n      currentPoint.lngGPS = currentPoint.lng\n      // 转换为地图坐标\n      currentPoint.lat = latLng.lat\n      currentPoint.lng = latLng.lng\n\n      // 如果当前点不是数组的第一个或最后一个点，并且它与下一个点不在同一边界内，则跳过\n      if (i !== 0 && i !== length - 1) {\n        const nextPointLatLng = this.getLatLng(trackPoints[i + 1])\n        if (\n          nextPointLatLng &&\n          !bounds.intersects([\n            L.latLng(currentPoint.lat, currentPoint.lng),\n            L.latLng(nextPointLatLng.lat, nextPointLatLng.lng),\n          ] as any)\n        ) {\n          if (prevIndex === i - 1) {\n            currentPoint.join = false\n            result.push(currentPoint)\n          }\n          continue\n        }\n      }\n      result.push(currentPoint)\n      prevIndex = i\n    }\n\n    // 调用压缩算法处理点集\n    return this._calcDrawTrackPointsZip(result)\n  }\n\n  _calcDrawTrackPointsZip(points: any[], dilutionFactor = 1): any[] {\n    const numPoints = points.length\n\n    // 如果点的数量小于设定的最大稀释数量，直接返回原始点集\n    if (numPoints <= this.diluteMaxCount + 1) {\n      return points\n    }\n\n    // 计算稀释比例\n    const dilutionStep = Math.max(\n      2,\n      Math.ceil(numPoints / (numPoints - this.diluteMaxCount))\n    )\n    const result = []\n\n    for (let i = 0; i < numPoints; i++) {\n      if (i !== 0 && i !== numPoints - 1) {\n        // 根据稀释比例决定是否保留当前点\n        if (i % dilutionStep !== 0) {\n          result.push(points[i])\n        } else {\n          // 如果当前点的类型与前一个点不同，并且满足显示条件，则保留当前点\n          const currentType = points[i].analysisInfo\n            ? points[i].analysisInfo.type\n            : ''\n          const prevType = points[i - 1].analysisInfo\n            ? points[i - 1].analysisInfo.type\n            : ''\n          if (\n            prevType !== currentType &&\n            ((this.stopShow && currentType === 'stop') ||\n              (this.slowShow && currentType === 'slow') ||\n              (this.suspectStopShow && currentType === 'suspectStop'))\n          ) {\n            result.push(points[i])\n          }\n        }\n      } else {\n        // 始终保留第一个和最后一个点\n        result.push(points[i])\n      }\n    }\n\n    // 如果稀释后的点集仍然大于设定的最大数量，递归调用此函数进行进一步稀释\n    if (result.length > this.diluteMaxCount + 1 && dilutionFactor <= 5) {\n      dilutionFactor++\n      return this._calcDrawTrackPointsZip(result, dilutionFactor)\n    }\n\n    return result\n  }\n  /**\n   * 显示ai检测\n   * @param latlngs\n   * @returns\n   */\n  _showTrackAi(latlngs: any[], appendAiList?: any[]) {\n    const zoom = this._map.getZoom()\n    const isAppend = appendAiList?.length\n    const same = this.oldAiLength === this.aiDetection.datas\n    if (this.aiDataCache && this.aiDataCache[zoom] && !isAppend && same) {\n      return this.aiDataCache[zoom]\n    }\n    const sortByData = sortBy(latlngs, ['utc'])\n    // 1. 确定在那两段时间中  开始时间 大于等于某个点 结束时间 小于等于某个点\n    const getStartEntItem = (time: number, type: 'start' | 'end') => {\n      const index = findIndex(sortByData, (item) => {\n        const itemUtcTime = item.utc\n        return time <= itemUtcTime\n      })\n      const findItem = find(sortByData, (item) => {\n        const itemUtcTime = item.utc\n        return time <= itemUtcTime\n      })\n      if (!Object.keys(findItem).length) {\n        console.log('未找到对应节点')\n        return { index: 0, item: null }\n      }\n      // 开始点位\n      // 找到相关时间 直接取点位和index\n      // 未找到相关时间 小于点位的时间 取前一个点位具体数据和index\n      // 结束点位\n      // 找到相关时间 直接取点位和index\n      // 未找到相关时间 小于点位的时间\n      return {\n        index:\n          findItem.utc === time ? index : type === 'start' ? index - 1 : index,\n        item:\n          findItem.utc === time\n            ? findItem\n            : type === 'start'\n            ? sortByData[index === 0 ? 0 : index - 1]\n            : findItem,\n      }\n    }\n\n    /**\n     *2. 依据两点的时间计算 给定的时间点的坐标点\n     * @param startTime 第一个时间点的UTC时间戳\n     * @param endTime 第二个时间点的UTC时间戳\n     * @param currentTime 给定的时间戳\n     */\n    const getDistanceLatlng = (\n      startItem: { lat?: any; lng?: any; utc?: any },\n      endItem: { lat?: any; lng?: any; utc?: any },\n      currentTime: number\n    ) => {\n      const { utc: startTime } = startItem\n      const { utc: endTime } = endItem\n\n      const timeFraction = (currentTime - startTime) / (endTime - startTime)\n      // 计算给定时间点的经纬度\n      const latGiven =\n        startItem.lat + (endItem.lat - startItem.lat) * timeFraction\n      const lonGiven =\n        startItem.lng + (endItem.lng - startItem.lng) * timeFraction\n\n      // 将经纬度转换为地图上的点\n      // const pointLatLng = L.latLng(latGiven, lonGiven)\n      // var pointGiven = this.map.latLngToContainerPoint(pointLatLng)\n\n      return {\n        lat: latGiven,\n        lng: lonGiven,\n      }\n    }\n\n    const appendAiDectionList = isAppend ? appendAiList : this.aiDetection.datas\n    let aiDetectionList: any[] = appendAiDectionList.map(\n      (item: { startTime: number; endTime: number }) => {\n        const { item: startItem, index: startIndex } = getStartEntItem(\n          item.startTime,\n          'start'\n        )\n        const { item: endItem, index: endIndex } = getStartEntItem(\n          item.endTime,\n          'end'\n        )\n        let completePoint: any[] = []\n        if (endIndex - startIndex > 1) {\n          completePoint = sortByData\n            .slice(startIndex + 1, endIndex)\n            .map((item) => ({ ...item, lat: item.lat, lng: item.lng }))\n        }\n        console.log(startItem, endItem)\n        if (!(startItem || endItem)) {\n          console.log('给定时间点不在记录的两个时间点之间')\n          return []\n        }\n        // 使用中间点坐标计算两点间坐标\n        const startLatLng = getDistanceLatlng(\n          startItem,\n          completePoint.length ? completePoint[0] : endItem,\n          item.startTime\n        )\n        const endLatLng = getDistanceLatlng(\n          completePoint.length\n            ? completePoint[completePoint.length - 1]\n            : startItem,\n          endItem,\n          item.endTime\n        )\n\n        return {\n          ...item,\n          startItem,\n          endItem,\n          startLatLng,\n          endLatLng,\n          completePoint,\n          polyline: [\n            [startLatLng.lat, startLatLng.lng],\n            ...completePoint.map((item) => [item.lat, item.lng]),\n            [endLatLng.lat, endLatLng.lng],\n          ],\n        }\n      }\n    )\n\n    aiDetectionList.forEach((item, index) => {\n      const aiDetectionLayer = L.polyline(item.polyline, {\n        renderer: this._map.canvas_track,\n        weight: this.emission.weight,\n        color: item.color,\n        old_color: item.color,\n        useGradient: true,\n        interactive: true, // 控制事件是否生效\n        opacity: 0.5, // 线透明度\n        // dashArray: '10,10', // 虚线样式\n        smoothFactor: 2.0, // 平滑因子\n        // noClip: false // 是否裁剪\n        index,\n      } as any)\n      aiDetectionLayer && layer.route.addLayer(aiDetectionLayer)\n      aiDetectionLayer\n        .on('click', (e) => {\n          if (this.aiDetection.event && this.aiDetection.event.clickCallback) {\n            this.aiDetection.event.clickCallback(\n              aiDetectionList[e.target.options.index]\n            )\n          }\n        })\n        .on('mouseover', (e: { latlng: L.LatLngExpression; target: any }) => {\n          // 可以在这里添加其他的交互，比如显示一个弹窗\n          const itemInfo = aiDetectionList[e.target.options.index]\n          const { navInfo = {} } = itemInfo\n          if (Object.keys(navInfo).length) {\n            let content = '<div class=\"ai-track-popup-customer\"><ul>'\n            if (itemInfo.startTime)\n              content += `<li>开始时间：${\n                itemInfo.startTime\n                  ? CommUtils.dataFormat(itemInfo.startTime * 1000)\n                  : '--'\n              }</li>`\n            if (itemInfo.endTime)\n              content += `<li>结束时间：${\n                itemInfo.endTime\n                  ? CommUtils.dataFormat(itemInfo.endTime * 1000)\n                  : '--'\n              }</li>`\n            if (navInfo.ATD) content += `<li>ATD 时间：${navInfo.ATD}</li>`\n            if (navInfo.ETA) content += `<li>ETA 时间：${navInfo.ETA}</li>`\n            if (navInfo.airPressure)\n              content += `<li>气压：${navInfo.airPressure}</li>`\n            if (navInfo.airTemp) content += `<li>气温：${navInfo.airTemp}</li>`\n            if (navInfo.beaufortScale)\n              content += `<li>风力等级：${navInfo.beaufortScale}</li>`\n            if (navInfo.speedCourse)\n              content += `<li>航速航向：${navInfo.speedCourse}</li>`\n            if (navInfo.status)\n              content += `<li>船舶状态：${navInfo.status}</li>`\n            if (navInfo.windSpeed)\n              content += `<li>风速：${navInfo.windSpeed}</li>`\n            if (navInfo.visibility)\n              content += `<li>能见度：${navInfo.visibility}</li>`\n            if (navInfo.description)\n              content += `<li>描述：${navInfo.description}</li>`\n            content += `</ul></div>`\n            L.popup({\n              closeButton: false,\n              className: 'ai-track-popup',\n            })\n              .setLatLng(e.latlng)\n              .setContent(content)\n              .openOn(toRaw(this._map))\n            e.target\n              .setStyle({\n                color: this.aiActivityColor,\n              })\n              .bringToFront()\n          }\n        })\n        .on('mouseout', (event) => {\n          event.target\n            .setStyle({\n              color: event.target.options.old_color,\n            })\n            .bringToBack()\n          // 关闭弹窗或者做其他的清理工作\n          this._map.closePopup()\n        })\n    })\n    if (!same && isAppend) {\n      aiDetectionList = [...(this.aiDataCache[zoom] || []), ...aiDetectionList]\n      this.aiDataCache = {}\n    }\n    this.aiDataCache[zoom] = aiDetectionList\n  }\n\n  _showTrackEmission(latlngs: any[]) {\n    return L.polycolor(\n      latlngs.map((item) =>\n        CanvasShipUtils.GPSEncryptByMapToLatLng([item.lat, item.lng], this._map)\n      ),\n      {\n        renderer: this._map.canvas_track,\n        weight: this.emission.weight,\n        colors: latlngs.map(\n          (item: { emissionCo2Color: any }) =>\n            item.emissionCo2Color || this.emission.colorsMap.default\n        ),\n        useGradient: true,\n        interactive: false,\n        opacity: 0.5, // 线透明度\n        // dashArray: '10,10', // 虚线样式\n        smoothFactor: 2.0, // 平滑因子\n        // noClip: false // 是否裁剪\n      } as any\n    )\n  }\n  setTrackEmissionShow(isShow: any) {\n    isShow\n      ? !this.emission\n        ? (console.info('当前轨迹暂无污染数据'), (this.emissionShow = false))\n        : (this.emissionShow = true)\n      : (this.emissionShow = false),\n      this.showTrack()\n  }\n  _getStopSlowTrack(startTime: number) {\n    const list = this._analysisResultSearch.filter(\n      (item: { startTime: number; endTime: number; isShow: boolean }) => {\n        return (\n          startTime >= item.startTime &&\n          startTime <= item.endTime &&\n          !item.isShow &&\n          ((item.isShow = true), true)\n        )\n      }\n    )\n    return list.length > 0 ? list[0] : null\n  }\n  showHtml(\n    currentTrack: any,\n    beforeTrack: any,\n    unit = ['name', 'mmsi', 'sog', 'cog', 'utc', 'kn']\n  ) {\n    let html = ''\n\n    const shipInfo = this.showHtml_data(currentTrack, beforeTrack)\n    const co2Method = {\n      co2: (shipInfo: { emissionCo2Count: number }) => {\n        return (\n          (shipInfo.emissionCo2Count && shipInfo.emissionCo2Count.toFixed(2)) ||\n          null\n        )\n      },\n    } as any\n    for (const key of unit) {\n      const value =\n        (co2Method[key] && co2Method[key](shipInfo)) || shipInfo[key]\n      html += this.showHtml_txt(value, key)\n    }\n    return html\n  }\n  showHtml_data(\n    currentTrack: { kn: number; utc: number },\n    beforeTrack: { kn: number; utc: number }\n  ) {\n    const shipObj = {} as any\n    if (this.ship) {\n      shipObj.mmsi = this.ship.mmsi\n      shipObj.name = this.ship.name\n    }\n    const shipInfo = L.Util.extend({}, currentTrack, shipObj)\n    shipInfo.utc = CommUtils.dataFormat(shipInfo.utc * 1000)\n    shipInfo.sog && (shipInfo.sog = Number(shipInfo.sog).toFixed(2))\n    beforeTrack &&\n      (shipInfo.sog2 = Number(\n        ((currentTrack.kn - beforeTrack.kn) /\n          (currentTrack.utc - beforeTrack.utc)) *\n          3600\n      ).toFixed(2))\n    shipInfo.kn && (shipInfo.kn = Number(shipInfo.kn).toFixed(1))\n    shipInfo.ed &&\n      shipInfo.ed > 0 &&\n      (shipInfo.ed = Number(shipInfo.ed).toFixed(1))\n    shipInfo.md &&\n      shipInfo.md > 0 &&\n      (shipInfo.md = Number(shipInfo.md).toFixed(1))\n    shipInfo.cog &&\n      shipInfo.cog > 0 &&\n      (shipInfo.cog = Number(shipInfo.cog).toFixed(0))\n    shipInfo.draught &&\n      shipInfo.draught > 0 &&\n      (shipInfo.draught = Number(shipInfo.draught).toFixed(1))\n    shipInfo.rot &&\n      shipInfo.rot > 0 &&\n      (shipInfo.rot = Number(shipInfo.rot).toFixed(1))\n    shipInfo.navistatus &&\n      shipInfo.navistatus >= 0 &&\n      (shipInfo.navistatus = CanvasShipUtils.getDisValue(\n        shipInfo.navistatus,\n        'naviStatus',\n        'zh_CN'\n      ))\n    shipInfo._lat = shipInfo.lat\n    shipInfo._lng = shipInfo.lng\n    shipInfo.lat = CanvasShipUtils.latFormatter(shipInfo.lat)\n    shipInfo.lng = CanvasShipUtils.lngFormatter(shipInfo.lng)\n    return shipInfo\n  }\n  showHtml_txt(value: string, key: string) {\n    let text = ''\n    CommUtils.isEmpty(value) ||\n      CommUtils.isEmpty(this.showHtml_txt_templater[key]) ||\n      (text = this.showHtml_txt_templater[key].replace('{1}', value))\n    return text\n  }\n  _on_baselayerchange() {\n    this.isShowTrack = true\n    this._map.off('moveend', this._Event.moveend)\n    this.showTrack()\n    this._map.on('moveend', this._Event.moveend)\n  }\n  /**\n   * 坐标点稀释\n   * @param trackData 轨迹数据\n   * @param isDilute 是否开启稀释\n   * @param zoomLevel\n   * @returns\n   */\n  dealWrapData(\n    trackData: any[],\n    isDilute: boolean,\n    isAppend = false,\n    zoomLevel = 1\n  ) {\n    const zoom = this._map.getZoom()\n    // 判断老的长度是否和 内存数据一致 走缓存 如果不一致 则往缓存中追加数据\n    const same = this.oldTrackLength === this.tracks.length\n    if (\n      this.diluteDataCache &&\n      this.diluteDataCache[zoom] &&\n      !isAppend &&\n      same\n    ) {\n      return this.diluteDataCache[zoom]\n    }\n    let result: any[] = []\n    const dataLength = trackData ? trackData.length : 0\n\n    // 如果数据点少于2个，则不需要处理\n    if (dataLength < 2) {\n      return trackData\n    }\n\n    // 如果只有2个数据点，标记为起始和结束点\n    if (dataLength === 2) {\n      trackData[0].isStartLatLng = true\n      trackData[dataLength - 1].isEndLatLng = true\n      return trackData\n    }\n\n    // 如果启用了稀释功能\n    if (isDilute) {\n      if (this.isDiluteType === 1) {\n        // 稀释类型1\n        let distanceThreshold = 30 // 默认距离阈值\n        switch (true) {\n          case zoom >= 18:\n            distanceThreshold = 100\n            break\n          case zoom >= 7:\n            distanceThreshold = 50\n            break\n          case zoom >= 6:\n          case zoom >= 5:\n            distanceThreshold = 60\n            break\n          default:\n            distanceThreshold = 30\n        }\n        for (let i = 0; i < dataLength; i++) {\n          const currentData = trackData[i]\n          if (!(i === 0 || i === dataLength - 1)) {\n            let distance = distanceThreshold * zoomLevel\n            const previousData = result[result.length - 1]\n            const currentLatLng = L.latLng(\n              this.getLat(currentData),\n              this.getLng(currentData)\n            )\n            const previousLatLng = L.latLng(\n              this.getLat(previousData),\n              this.getLng(previousData)\n            )\n            const layerPointCurrent =\n              this._map.latLngToLayerPoint(currentLatLng)\n            const layerPointPrevious =\n              this._map.latLngToLayerPoint(previousLatLng)\n            const deltaX = Math.abs(layerPointCurrent.x - layerPointPrevious.x)\n            const deltaY = Math.abs(layerPointCurrent.y - layerPointPrevious.y)\n            const maxDistance = Math.max(deltaX, deltaY)\n            if (Math.abs(currentData.cog - previousData.cog) < 10) {\n              distance = Math.max(100, distance)\n            }\n            const isClose = this.dealWrapDataFilter(currentData, previousData)\n            if (!(maxDistance >= distance || isClose)) {\n              if (\n                maxDistance < distance &&\n                currentData.sog === 0 &&\n                result.length > 2\n              ) {\n                result[result.length - 1] = currentData\n              }\n              continue\n            }\n          }\n          result.push(currentData)\n        }\n      }\n      if (this.isDiluteType === 2) {\n        // 稀释类型2\n        let threshold = 1800 // 默认阈值\n        switch (zoom) {\n          case 1:\n          case 2:\n            threshold *= 50\n            break\n          case 3:\n            threshold *= 25\n            break\n          case 4:\n            threshold *= 10\n            break\n          case 5:\n          case 6:\n            threshold *= 5\n            break\n          case 7:\n            threshold *= 3\n            break\n          case 8:\n            threshold *= 1.5\n            break\n          case 9:\n            threshold *= 1\n            break\n          case 10:\n            threshold *= 0.7\n            break\n          case 11:\n            threshold *= 0.5\n            break\n          case 12:\n            threshold *= 0.05\n            break\n          case 13:\n            threshold *= 0.02\n            break\n          case 14:\n            threshold *= 0.005\n            break\n          case 15:\n            threshold *= 0.0005\n            break\n          case 16:\n            threshold *= 0.0002\n            break\n          case 17:\n            threshold *= 0.0001\n            break\n          default:\n            threshold = 0\n        }\n        result =\n          threshold * zoomLevel > 0\n            ? Douglas.douglasPeucker(trackData, threshold * zoomLevel)\n            : result.concat(trackData)\n      }\n    } else {\n      result = result.concat(trackData)\n    }\n\n    // 确保起始和结束点被标记\n    if (result.length > 0) {\n      result[0].isStartLatLng = true\n      result[result.length - 1].isEndLatLng = true\n    }\n\n    result = result || []\n\n    if (!same && isAppend) {\n      result = [...(this.diluteDataCache[zoom] || []), ...result]\n      this.diluteDataCache = {}\n    }\n\n    // 缓存稀释后的数据\n    this.diluteDataCache[zoom] = result\n    return result\n  }\n\n  dealWrapDataFilter(\n    currentItem: { analysisInfo: { type: any }; from: number; isKeep: number },\n    compareItem: { analysisInfo: { type: any }; from: number }\n  ) {\n    let shouldFilterOut = false\n    const currentAnalysisType = currentItem.analysisInfo\n      ? currentItem.analysisInfo.type\n      : ''\n    const compareAnalysisType = compareItem.analysisInfo\n      ? compareItem.analysisInfo.type\n      : ''\n\n    if (\n      (this.stopShow &&\n        'stop' === currentAnalysisType &&\n        compareAnalysisType !== currentAnalysisType) ||\n      (this.slowShow &&\n        'slow' === currentAnalysisType &&\n        compareAnalysisType !== currentAnalysisType) ||\n      (this.suspectStopShow && 'suspectStop' === currentAnalysisType) ||\n      (2 === currentItem.from && 2 !== compareItem.from) ||\n      1 === currentItem.isKeep\n    ) {\n      shouldFilterOut = true\n    }\n\n    return shouldFilterOut\n  }\n\n  getLng(coordinates: { lng: any; lon: any }) {\n    if (coordinates) return coordinates.lng ? coordinates.lng : coordinates.lon\n  }\n  getLat(coordinates: { lat: any }) {\n    if (coordinates) return coordinates.lat\n  }\n  getLatLng(point: any) {\n    return this._map.offsetC\n      ? this.getOffsetLatLng({\n          lat: point.lat,\n          lng: 'lng' in point ? point.lng : point.lon,\n        })\n      : {\n          lat: point.lat,\n          lng: 'lng' in point ? point.lng : point.lon,\n        }\n  }\n  getLineDir(\n    startCoordinates: L.LatLngExpression,\n    endCoordinates: L.LatLngTuple | { lat: any; lng: any } | null\n  ) {\n    if (endCoordinates) {\n      const angleDegrees = CanvasShipUtils.getAngleByLatLng(\n        startCoordinates,\n        endCoordinates\n      )\n      return (angleDegrees >= 22.5 && angleDegrees < 67.5) ||\n        (angleDegrees >= 202.5 && angleDegrees < 270)\n        ? 2\n        : 1\n    }\n    return 2\n  }\n  getTrackLabelPath1(latAndLng: { lat: any; lng: any }, type: number) {\n    let latlngs, rotatePoint\n    const zoom = this._map.getZoom()\n    const scan = 1.2 / 2 ** zoom\n    switch (type) {\n      case 2:\n        latlngs = [\n          [0, 0],\n          [-20, 20],\n        ]\n        break\n      case 3:\n        latlngs = [\n          [0, 0],\n          [-20, -20],\n        ]\n        break\n      case 4:\n        latlngs = [\n          [0, 0],\n          [20, -20],\n        ]\n        break\n      default:\n        latlngs = [\n          [0, 0],\n          [20, 20],\n        ]\n    }\n    for (const latlng of latlngs) {\n      rotatePoint = this.getRotatePoint(0, 0, latlng[0], latlng[1], 0)\n      latlng[0] = latAndLng.lat + rotatePoint.x * scan\n      latlng[1] = latAndLng.lng + rotatePoint.y * scan\n    }\n    return latlngs\n  }\n  getTrackLabelPath2(\n    latAndLng: { lat: any; lng: any },\n    lng: number,\n    type: number\n  ) {\n    let latlngs, latlng, rotatePoint\n    const zoom = this._map.getZoom()\n    const scan = 1.2 / 2 ** zoom\n    switch (type) {\n      case 2:\n        latlngs = [\n          [-20, 20],\n          [-20, lng],\n        ]\n        break\n      case 3:\n        latlngs = [\n          [-20, -lng],\n          [-20, -20],\n        ]\n        break\n      case 4:\n        latlngs = [\n          [20, -lng],\n          [20, -20],\n        ]\n        break\n      default:\n        latlngs = [\n          [20, 20],\n          [20, lng],\n        ]\n    }\n    for (const latlng of latlngs) {\n      rotatePoint = this.getRotatePoint(0, 0, latlng[0], latlng[1], 0)\n      latlng[0] = latAndLng.lat + rotatePoint.x * scan\n      latlng[1] = latAndLng.lng + rotatePoint.y * scan\n    }\n    return latlngs\n  }\n  setAreaPath(centerCoordinates: L.LatLngExpression, width: number) {\n    const centerPoint = this._map.latLngToLayerPoint(centerCoordinates)\n    const leftPoint = this._map.layerPointToLatLng(\n      L.point(centerPoint.x - width / 2, centerPoint.y)\n    )\n    const rightPoint = this._map.layerPointToLatLng(\n      L.point(centerPoint.x + width / 2, centerPoint.y)\n    )\n\n    return {\n      polygon: L.polyline(\n        [\n          [leftPoint.lat, leftPoint.lng],\n          [rightPoint.lat, rightPoint.lng],\n        ],\n        {\n          renderer: this._map.canvas_track,\n          color: 'transparent', // Assuming you want no stroke color, but making it transparent for clarity\n          weight: 0,\n          fill: false,\n          opacity: 0,\n        }\n      ),\n      offset: {\n        x: centerPoint.x - width / 2,\n        y: centerPoint.y,\n      },\n    }\n  }\n  getRotatePoint(\n    originalX: number,\n    originalY: number,\n    pointX: number,\n    pointY: number,\n    angleDegrees: number\n  ) {\n    const angleRadians = (angleDegrees * Math.PI) / 180\n    return {\n      x:\n        (pointX - originalX) * Math.cos(angleRadians) -\n        (pointY - originalY) * Math.sin(angleRadians) +\n        originalX,\n      y:\n        (pointY - originalY) * Math.cos(angleRadians) +\n        (pointX - originalX) * Math.sin(angleRadians) +\n        originalY,\n    }\n  }\n\n  addLabelCache(lineCoordinates: any[][]) {\n    const startPoint = [lineCoordinates[0][0], lineCoordinates[0][1]]\n    const endPoint = [lineCoordinates[1][0], lineCoordinates[1][1]]\n    const startPointLayer = this._map.latLngToLayerPoint(\n      this.toLatlng([startPoint[0], startPoint[1]])\n    )\n    const endPointLayer = this._map.latLngToLayerPoint(\n      this.toLatlng([endPoint[0], endPoint[1]])\n    )\n    const labelLine = [\n      { x: endPointLayer.x, y: endPointLayer.y + 10 },\n      { x: startPointLayer.x, y: startPointLayer.y - 10 },\n    ]\n\n    if (this.labelCache.length > 0) {\n      for (const existingLines of this.labelCache) {\n        if (this.idCrossLine(labelLine, existingLines)) return false\n      }\n      this.labelCache.push(labelLine)\n      return true\n    }\n    this.labelCache.push(labelLine)\n    return true\n  }\n  toLatlng(coordinates: number[]) {\n    return new L.LatLng(coordinates[0], coordinates[1])\n  }\n  resetCache() {\n    this.aiDataCache = {}\n    this.diluteDataCache = {}\n    this.showTrack()\n  }\n  idCrossLine(line1: any, line2: any) {\n    // line1 和 line2 是两个线段的端点数组，每个端点包含 x 和 y 坐标\n    // line1[0] 和 line1[1] 是线段1的起点和终点\n    // line2[0] 和 line2[1] 是线段2的起点和终点\n\n    // 计算线段的中点\n    const mid1 = {\n      x: (line1[0].x + line1[1].x) / 2,\n      y: (line1[0].y + line1[1].y) / 2,\n    }\n    const mid2 = {\n      x: (line2[0].x + line2[1].x) / 2,\n      y: (line2[0].y + line2[1].y) / 2,\n    }\n\n    // 计算线段的边距（线段到中点的水平和垂直距离）\n    const dist1X = Math.abs(mid1.x - line1[0].x)\n    const dist2X = Math.abs(mid2.x - line2[0].x)\n    const dist1Y = Math.abs(mid1.y - line1[0].y)\n    const dist2Y = Math.abs(mid2.y - line2[0].y)\n\n    // 判断两条线段是否相交\n    // 如果中点之间的距离小于各自到端点的距离，则线段相交\n    return (\n      Math.abs(mid1.x - mid2.x) < Math.min(dist1X, dist2X) &&\n      Math.abs(mid1.y - mid2.y) < Math.min(dist1Y, dist2Y)\n    )\n  }\n  addTrackManager(labelPath: any[][]) {\n    const startPoint = [labelPath[0][0], labelPath[0][1]]\n    const endPoint = [labelPath[1][0], labelPath[1][1]]\n\n    // 将经纬度坐标转换为图层坐标点\n    const startPointLayer = this._map.latLngToLayerPoint(\n      this.toLatlng(startPoint)\n    )\n    const endPointLayer = this._map.latLngToLayerPoint(this.toLatlng(endPoint))\n\n    // 创建标签路径点数组\n    const labelPathPoints = [\n      {\n        x: endPointLayer.x,\n        y: endPointLayer.y + 10, // 向右偏移10个像素\n      },\n      {\n        x: startPointLayer.x,\n        y: startPointLayer.y - 10, // 向下偏移10个像素\n      },\n    ]\n\n    // 如果标签缓存中已经有元素\n    if (this.labelCache.length > 0) {\n      for (let i = 0; i < this.labelCache.length; i++) {\n        const cacheItem = this.labelCache[i] // _0x3f65b2\n        // 如果新标签路径与缓存中的任一项相交，则返回false\n        if (this.idCrossLine(labelPathPoints, cacheItem)) {\n          return false\n        }\n      }\n      // 如果没有相交，添加新标签路径到缓存，并返回true\n      this.labelCache.push(labelPathPoints)\n      return true\n    }\n    // 如果标签缓存为空，添加新标签路径到缓存，并返回true\n    this.labelCache.push(labelPathPoints)\n    return true\n  }\n\n  getOffsetLatLng(coordinate: { lat: any; lng: any }) {\n    const encryptedCoordinate = GPS.gcj_encrypt(coordinate.lat, coordinate.lng)\n    return {\n      lat: encryptedCoordinate.lat,\n      lng: encryptedCoordinate.lon,\n    }\n  }\n  /**\n   * 追加航线分段加载\n   */\n  appendLine(tracks: any[], aiDetectionList?: []) {\n    this.tracks = [...toRaw(this.tracks), ...tracks.slice(1, tracks.length)]\n    const processedData = this.calcProcessedData(tracks, true)\n    this.oldTrackLength = this.tracks.length\n    // 显示ai检测船舶数据\n    if (\n      this.aiDetectionShow &&\n      this.aiDetection.show &&\n      aiDetectionList &&\n      aiDetectionList.length\n    ) {\n      this.aiDetection.datas = [...this.aiDetection.datas, ...aiDetectionList]\n      this._showTrackAi(processedData, aiDetectionList)\n      this.oldAiLength = this.aiDetection.datas.length\n    }\n    this.drawLine(processedData)\n  }\n}\nconst trackSymbol = (map: MyMap, data: any[], ship: any, options: DataObj) => {\n  return new TrackSymbolImpl(map, data, ship, options)\n}\n\nexport { trackSymbol, TrackSymbolImpl }\n"],"names":["U","g","A","route","Z","Symbol","ArrowHead","extend","_buildArrowPath","T","e","o","Math","PI","n","project","latLng","t","heading","c","this","options","headAngle","a","s","i","Point","x","pixelSize","cos","y","sin","h","w","m","unproject","E","F","constructor","L","d","u","p","r","l","isDilute","aiDataCache","oldTrackLength","oldAiLength","_Event","moveend","showTrack","baselayerchange","_on_baselayerchange","trackid","tracks","length","ship","_map","canvas_track","canvas","trackNew","isShowTrack","lineColor","lineWeight","dash","dashArray","circleOverColor","textColor","emission","emissionShow","aiDetection","aiDetectionShow","aiActivityColor","activityColor","datas","startShow","endShow","middleShow","stopShow","slowShow","suspectStopShow","directionShow","isShowLable","isOpenMathColor","isShowTip","isShowLineHover","lableFields","showTimeType","tipHideTimeOut","notDiluteZoom","isDiluteType","diluteDataCache","diluteMaxCount","startCircleType","endCircleType","startCircleColor","endCircleColor","circleColor","circleFillColor","circleLowSogColor","circleLowSogFillColor","startImg","I","data_img","track_star","endImg","track_end","stopImg","track_stop","slowImg","track_slow","suspectStopImg","track_suspectStop","analysisResult","Object","assign","stops","slows","suspectStops","preZoom","preLatlng","tracklang","trackLangCount","labelCache","pointClick","pointIconClick","lableMap","arcMin","zIndex","_analysisResultSearch","showHtml_txt_templater","name","mmsi","sog","cog","utc","kn","ed","md","draught","dest","eta","navistatus","rot","hdg","lat","lng","sog2","co2","mouseTip","show","f","C","b","M","P","S","_tooltipLegend","DomUtil","create","document","body","style","width","D","getMousePos","originalEvent","left","top","childNodes","innerHTML","display","hide","window","event","documentElement","scrollLeft","scrollTop","pageX","clientX","pageY","clientY","off","on","removeTrack","setZIndex","_container","clearLayers","remove","Date","now","featureGroup","addTo","calcProcessedData","_showTrackAi","drawLine","floor","random","join","latLngToLayerPoint","latLngBounds","getCenter","abs","index","k","getDistance","Control","PolylineMeasure","prototype","_polylineArc","polyline","renderer","color","weight","opacity","distanceTo","polylineDecorator","patterns","offset","symbol","pathOptions","fillOpacity","addLayer","setStyle","popup","closeButton","className","setLatLng","latlng","setContent","showHtml","target","openOn","v","closePopup","isShowMarker","getLineDir","from","dataFormat","max","calcStrLength","getTrackLabelPath1","getTrackLabelPath2","addTrackManager","fillColor","latLngToContainerPoint","push","containerPointToLatLng","point","polygon","lineCap","lineJoin","setText","repeat","attributes","fill","iconUrl","iconAnchor","marker","icon","isStartLatLng","isEndLatLng","_data","type","track","radius","old_color","circleMarker","setTimeout","showHtml_data","analysisInfo","clearTimeout","mouseTipTimer","iconSize","includes","_stopMight","_time","bindTooltip","direction","permanent","openTooltip","replace","toFixed","sogAvg","sogMight","dealWrapData","_showTrackEmission","arrawShow","endOffset","arrawColor","_calcDrawTrackPoints","map","_","getLatLng","getBounds","latGPS","lngGPS","intersects","_calcDrawTrackPointsZip","ceil","getZoom","Y","H","B","keys","item","startTime","endTime","slice","startItem","endItem","startLatLng","endLatLng","completePoint","forEach","useGradient","interactive","smoothFactor","clickCallback","navInfo","ATD","ETA","airPressure","airTemp","beaufortScale","speedCourse","status","windSpeed","visibility","description","bringToFront","bringToBack","polycolor","GPSEncryptByMapToLatLng","colors","emissionCo2Color","colorsMap","default","setTrackEmissionShow","_getStopSlowTrack","filter","isShow","emissionCo2Count","showHtml_txt","Util","Number","getDisValue","_lat","_lng","latFormatter","lngFormatter","isEmpty","getLat","getLng","dealWrapDataFilter","W","douglasPeucker","concat","isKeep","lon","offsetC","getOffsetLatLng","getAngleByLatLng","getRotatePoint","setAreaPath","layerPointToLatLng","addLabelCache","toLatlng","idCrossLine","LatLng","resetCache","min","V","gcj_encrypt","appendLine","R"],"mappings":"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"}