{"version":3,"file":"TrackPlayServiceImpl.mjs","sources":["../../../../../../packages/sdk/plugins/Trackplayer/TrackPlayServiceImpl.ts"],"sourcesContent":["import L from 'leaflet'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport 'leaflet-polylinedecorator'\n\n/**\n * 箭头延伸\n */\nconst TrackShipSymbol = L.Symbol.ArrowHead.extend({\n  hdg: 0,\n  _buildArrowPath(layer: any, point: any) {\n    const points: L.Point[] = []\n    const projected = point.project(layer.latLng)\n    // 获取船只模板配置\n    const ship = this.options.ship\n    let shipTemplate = CanvasShipUtils.getShipTemplater(\n      point,\n      ship,\n      13,\n      this.options.shipTemplaterThree\n    )\n    // 根据缩放级别调整船只模板尺寸\n    shipTemplate = CanvasShipUtils.sizeZoomShipTemplater(\n      shipTemplate,\n      this.options.shipTemplaterZoom\n    ) as any\n\n    const centerPoint = [projected.x, projected.y]\n\n    // 计算中心坐标偏移量\n    const offsetX = centerPoint[0] - shipTemplate.centerXY[0]\n    const offsetY = centerPoint[1] - shipTemplate.centerXY[1]\n    const angle = layer.heading\n    // if (this.hdg && this.hdg > 0) {\n    //   angle = this.hdg\n    // }\n    // console.log(angle)\n    // 遍历船只模板的每个点，旋转并转换为地图坐标\n    for (let i = 0; i < shipTemplate.area.length; i++) {\n      const x = shipTemplate.area[i][0] + offsetX\n      const y = shipTemplate.area[i][1] + offsetY\n      const rotatedPoint = CanvasShipUtils.pointRotate(\n        centerPoint,\n        [x, y],\n        angle\n      )\n      points.push(\n        point.unproject(new L.Point(rotatedPoint[0], rotatedPoint[1]))\n      )\n    }\n\n    return points\n  },\n})\nconst trackShipSymbol = (options = {}) => {\n  return new TrackShipSymbol(\n    Object.assign(\n      {\n        shipTemplaterThree: CanvasShipUtils.shipTemplaterThree,\n        shipTemplaterZoom: 1.5,\n      },\n      options\n    )\n  )\n}\ninterface TrackPlayServiceOptions {\n  playSpeed: number\n  playFrequency: number\n  beginTime: number\n  showPlayObjLable: boolean\n  playObjPlayerItems: string[]\n  playObjLabelItems: string[]\n  shipTemplaterThree: any\n  shipTemplaterZoom: number\n  isPlayerDraggable: boolean\n  isVisiableWithNoSignal: boolean\n  isVisiableOutOfBounds: boolean\n  isVisiableShipTrack: boolean\n  shipTrackMaxInterval: number\n  onCloseRemoveAllTrack: boolean\n  playCallBack?: ((currentTimePosition: number, params: any) => void) | null\n  playGPSCallBack?: ((...params: any) => void) | null\n  closeCallback?: (() => void) | null\n  fullScreenCallback?: (() => void) | null\n  shipListClickCallback?: ((...params: any) => void) | null\n  labelOptionCallback?: ((...params: any) => void) | null\n}\nclass TrackPlayServiceImpl {\n  options: TrackPlayServiceOptions = {\n    playSpeed: 1,\n    playFrequency: 100,\n    beginTime: 0,\n    showPlayObjLable: true,\n    playObjPlayerItems: ['name', 'mmsi'], //'hdg', 'cog', 'sog'\n    playObjLabelItems: ['name', 'mmsi'], //'hdg', 'cog', 'sog'\n    shipTemplaterThree: {\n      name: 'three',\n      area: [\n        [0, 0],\n        [6, -16],\n        [12, 0],\n        [6, -4],\n        [0, 0],\n      ],\n      centerXY: [6, -8],\n      headXY: [6, -16],\n      headXY2: [6, -31],\n    },\n    shipTemplaterZoom: 1.5,\n    isPlayerDraggable: true,\n    isVisiableWithNoSignal: true,\n    isVisiableOutOfBounds: false,\n    isVisiableShipTrack: false,\n    shipTrackMaxInterval: 0,\n    onCloseRemoveAllTrack: true,\n  }\n  playState: boolean\n  requestingData: boolean\n  currentTimePosition: number\n  playSpeed: number\n  playSpeedList: number[]\n  playSpeedOne: number\n  minTime: number\n  maxTime: number\n  playTrackItems: {\n    [key: string]:\n      | any\n      | {\n          data: {\n            [time: number]: L.LatLngExpression\n          }\n          dataInfo: {\n            [time: number]: any\n          }\n        }\n  }\n  playObjBMD: any\n  playObjHMD: any\n  maxSupplementPointInterval: number\n  step: number\n  curStep: number\n  shipHistoryTrackStyle: {\n    renderer: any\n    color: string\n    fillColor: string\n    weight: number\n  }\n  shipHistoryTrackData: any\n  shipHistoryTrackLine: any\n  _map: any\n  _hasLoadDone: boolean\n  _loadDataPercent: number\n  budian_timers: any\n  _playObjLabelTemplater: {\n    name: string\n    mmsi: string\n    hdg: string\n    sog: string\n    cog: string\n  } = {\n    name: '<div class=\"trackPlay_label trackPlay_label_name\">船名：{value}</div>',\n    mmsi: '<div class=\"trackPlay_label trackPlay_label_mmsi\">MMSI：{value}</div>',\n    hdg: '<div class=\"trackPlay_label trackPlay_label_hdg\">航首向：{value}度</div>',\n    sog: '<div class=\"trackPlay_label trackPlay_label_sog\">速度：{value}节</div>',\n    cog: '<div class=\"trackPlay_label trackPlay_label_cog\">航迹向：{value}度</div>',\n  }\n  isMousedown = false\n  playBtn?: HTMLButtonElement\n  playerCtime?: HTMLElement\n  playerEtime?: HTMLElement\n  playerDiv?: HTMLDivElement\n  playerTitleDiv?: HTMLDivElement\n  playerTitleOption?: HTMLDivElement\n  playerTitleBtn?: HTMLDivElement\n  playerTitleFullScreen?: HTMLDivElement\n  playerTiao?: HTMLDivElement\n  playerJindu?: HTMLDivElement\n  playSpeedSelectUL: any\n  playSpeedText: any\n  playSpeedSelectlis: HTMLElement[] = []\n  playerTiaoW = 0\n  playerYuan: any\n  trackInfo_leftBtn: any\n  trackInfo_rightBtn: any\n  trackInfoViewCount = 1\n  shipListBtn?: HTMLElement\n  playSate: any\n  playerTimeDiv?: HTMLDivElement\n  playSpeedDiv?: HTMLDivElement\n  playSpeedImg?: HTMLDivElement\n  shipListBtnText?: HTMLDivElement\n  trackInfoSHBtn: any\n  trackInfoDiv?: HTMLDivElement\n  trackInfo_center?: HTMLDivElement\n  trackInfoCIndex = 0\n  shipListDiv?: HTMLDivElement\n  shipList_title?: HTMLDivElement\n  shipList_content?: HTMLDivElement\n  shipList_foot?: HTMLDivElement\n  playerPercentage?: number\n  playerMinValue?: number\n  playerMaxValue?: number\n  draggable: any\n  trackInfoCenter: any\n  playerOptionDiv?: HTMLDivElement\n\n  constructor(map: any, options?: Partial<TrackPlayServiceOptions>) {\n    this.options = Object.assign(this.options, options)\n    this.playState = false\n    this.requestingData = false\n    this.currentTimePosition = 0\n    this.playSpeed = 1\n    this.playSpeedList = [1, 2, 6, 12, 30, 60, 120, 240, 480]\n    this.playSpeedOne = 1\n    this.minTime = 0\n    this.maxTime = 0\n    this.playTrackItems = {}\n    this.playObjBMD = {}\n    this.playObjHMD = {}\n    this.maxSupplementPointInterval = 600\n    this.step = 0\n    this.curStep = 0\n    this.shipHistoryTrackStyle = {\n      renderer: L.canvas(),\n      color: 'red',\n      fillColor: 'rgba(255,0,0,0.2)',\n      weight: 1.5,\n    }\n    this.shipHistoryTrackData = {}\n    this.shipHistoryTrackLine = {}\n    this._map = map\n    this._hasLoadDone = false\n    this._loadDataPercent = 0\n    this.budian_timers = {}\n    // 检测引入脚本\n    // this._checkDependence()\n    this.setPlaySpeed(this.options.playSpeed)\n    this.currentTimePosition = this.options.beginTime\n    this._createPlayerHtml()\n  }\n\n  addPlayTrack(trackId: string | null, isAutoPlay = true): void {\n    if (trackId !== null) {\n      const trackItem = this._map.trackService.get(trackId)\n      return this.addPlayTrackByItem(trackId, trackItem, isAutoPlay)\n    }\n    for (const trackId in this._map.trackService.items) {\n      const trackItem = this._map.trackService.items[trackId]\n      if (\n        trackItem !== null &&\n        trackItem.options.isEnablePlayer === 1 &&\n        trackItem.symbol !== null\n      ) {\n        this.addPlayTrackByItem(trackId, trackItem, isAutoPlay)\n      }\n    }\n  }\n\n  addPlayTrackByItem(trackId: string, trackItem: any, isAutoPlay = true): any {\n    if (!trackItem) return null\n    trackItem.trackId = trackId\n    trackItem.isAdd = trackItem.isAdd === 0\n    trackItem.requesting = trackItem.requesting === 0\n    trackItem.isBMD = trackItem.isBMD !== null && trackItem.isBMD\n    if (trackItem.isBMD && !this.playObjBMD[trackId]) {\n      this.playObjBMD[trackId] = true\n    }\n    this.requestingData = trackItem.requesting\n    if (trackId in this.playTrackItems && !trackItem.isAdd) {\n      this.removeTracks([trackId])\n    }\n    CanvasShipUtils.latlngsFrom180(trackItem.data)\n    const supplementedLatLng = this._supplementLatLng(trackItem)\n    if (supplementedLatLng === null) return null\n    supplementedLatLng.trackid = trackId\n    this.playTrackItems[trackId] = supplementedLatLng\n    this._resetMinMaxTime(\n      trackItem.startTime,\n      trackItem.endTime,\n      !trackItem.isAdd\n    )\n    this.setPlayerDisplay(false, trackItem.isAdd)\n    this._playTrackInfoCarousel()\n    if (isAutoPlay) {\n      this.playStart(0, false)\n    } else {\n      this.playStop()\n    }\n    return supplementedLatLng\n  }\n\n  setDataLoadDone(hasLoadDone: boolean, loadPercent = 0): boolean {\n    this._hasLoadDone = hasLoadDone\n    this._loadDataPercent = loadPercent || 0\n    if (hasLoadDone) {\n      CommUtils.msg('数据加载完成')\n    }\n    return hasLoadDone\n  }\n\n  clearPlayObjBMD(): void {\n    this.playObjBMD = {}\n  }\n\n  clearPlyObjHMD(): void {\n    this.playObjHMD = {}\n  }\n\n  removeTracks(trackIds?: string[]): void {\n    trackIds = trackIds || Object.keys(this.playTrackItems)\n    for (const trackId of trackIds) {\n      const trackItem = this.playTrackItems[trackId]\n      if (trackItem) {\n        this.removePlayObjByItem(trackItem)\n        document.querySelector(`#trackinfo_${trackId}`)?.remove()\n        this.playTrackItems[trackId] = null\n        delete this.playTrackItems[trackId]\n      }\n    }\n    this._resetMinMaxTime()\n    this.setPlayerDisplay(false)\n    this.playStart(0, false)\n  }\n\n  removePlayObjByItem(trackItem: any): void {\n    if (trackItem.playObj) {\n      this._map.removeLayer(trackItem.playObj)\n      trackItem.playObj = null\n    }\n    if (trackItem.playObjLabel) {\n      this._map.removeLayer(trackItem.playObjLabel)\n      trackItem.playObjLabel = null\n    }\n  }\n\n  playStart(currentTime = 0, isAdd?: boolean, isSupple?: boolean): void {\n    if (isSupple === undefined) isSupple = true\n    if (currentTime) {\n      this.currentTimePosition = Math.max(this.minTime, currentTime)\n      this.currentTimePosition = Math.min(\n        this.currentTimePosition,\n        this.maxTime\n      )\n    } else {\n      this.currentTimePosition = Math.max(\n        this.currentTimePosition,\n        this.minTime\n      )\n      this.currentTimePosition = Math.min(\n        this.currentTimePosition,\n        this.maxTime\n      )\n    }\n    if (\n      this.currentTimePosition >= this.maxTime ||\n      this.currentTimePosition <= this.minTime\n    ) {\n      this.currentTimePosition = this.minTime\n    }\n    isAdd = isAdd === undefined ? false : isAdd\n    if (!this.playState) {\n      this.playState = true\n      this._playByPosition(isAdd)\n    }\n    if (!isAdd && this.playBtn) {\n      L.DomUtil.removeClass(this.playBtn, 'start')\n      L.DomUtil.removeClass(this.playBtn, 'stop')\n      L.DomUtil.addClass(this.playBtn, 'stop')\n    }\n  }\n\n  playStop(): void {\n    this.playState = false\n    if (this.playBtn) {\n      L.DomUtil.removeClass(this.playBtn, 'start')\n      L.DomUtil.removeClass(this.playBtn, 'stop')\n      L.DomUtil.addClass(this.playBtn, 'start')\n    }\n  }\n\n  playStartOrStop(): boolean {\n    if (this.playState) {\n      this.playStop()\n    } else {\n      this.playStart()\n    }\n    return this.playState\n  }\n\n  setPlaySpeed(speed: number): number {\n    const index = this.playSpeedList.indexOf(speed)\n    if (index === -1) {\n      speed = this.playSpeedList[0]\n    }\n    this.playSpeed = speed\n    if (this.playSpeedSelectUL) {\n      // 获取所有.playSpeed-select下的li元素并移除active类\n      const listItems = document.querySelectorAll('.playSpeed-select li')\n      listItems.forEach((item) => item.classList.remove('active'))\n\n      // 为匹配playSpeed属性值为speed的li元素添加active类\n      const activeItem = document.querySelector(\n        `.playSpeed-select li[playSpeed=\"${speed}\"]`\n      )\n      if (activeItem) {\n        activeItem.classList.add('active')\n      }\n      this.playSpeedText.setAttribute('playSpeed', speed)\n      this.playSpeedText.innerHTML = speed === 1 ? '倍速' : `${speed}X`\n    }\n    return this.playSpeed\n  }\n\n  setPlaySpeedList(speeds: number[], defaultSpeed: number): number[] {\n    this.playSpeedList = speeds || this.playSpeedList\n    defaultSpeed = defaultSpeed ? Number(defaultSpeed) : this.playSpeedList[0]\n    if (defaultSpeed !== this.playSpeed) {\n      this.setPlaySpeed(defaultSpeed)\n    }\n    if (this.playSpeedSelectUL) {\n      this.playSpeedSelectUL.remove()\n      this.playSpeedSelectUL = L.DomUtil.create(\n        'ul',\n        'playSpeed-select truckplayer-display-none',\n        this.playerOptionDiv\n      )\n      this.playSpeedSelectlis = []\n      let speedHtml: HTMLElement | null = null\n      this.playSpeedList.forEach((item) => {\n        this.playSpeed == item && 1 == this.playSpeed\n          ? ((this.playSpeedText.innerHTML = '倍速'),\n            this.playSpeedText.setAttribute('playSpeed', '1'))\n          : this.playSpeed == item &&\n            ((this.playSpeedText.innerHTML = `${item}X`),\n            this.playSpeedText.setAttribute('playSpeed', `${item}`)),\n          (speedHtml = L.DomUtil.create(\n            'li',\n            this.playSpeed == item ? 'active' : '',\n            this.playSpeedSelectUL\n          )).setAttribute('playSpeed', `${item}`),\n          (speedHtml.innerHTML = `${item}X`),\n          this.playSpeedSelectlis.push(speedHtml)\n      })\n      // 获取所有的li元素\n      const playSpeedSelectListItems = document.querySelectorAll(\n        '.playSpeed-select li'\n      )\n\n      // 为每个li元素添加点击事件监听器\n      playSpeedSelectListItems.forEach((item) => {\n        item.addEventListener('click', (event) => {\n          // 获取当前点击的li元素的playSpeed属性值\n          const playSpeed =\n            (event.currentTarget as HTMLLIElement).getAttribute('playSpeed') ||\n            0\n          this.setPlaySpeed(playSpeed as any)\n          this.playSpeedSelectUL.style.display = 'none'\n        })\n      })\n    }\n    return this.playSpeedList\n  }\n\n  getPlaySpeed(): number {\n    return this.playSpeed\n  }\n\n  setPlayerDisplay(show?: boolean, isAdd?: boolean): void {\n    if (!show) {\n      show = this.maxTime - this.minTime > 0\n    }\n    this.playerDiv &&\n      L.DomUtil.removeClass(this.playerDiv, 'truckplayer-display-none')\n    this.playerDiv &&\n      L.DomUtil.removeClass(this.playerDiv, 'truckplayer-display-block')\n    if (show) {\n      this.playerDiv &&\n        L.DomUtil.addClass(this.playerDiv, 'truckplayer-display-block')\n      this.playerTiao &&\n        (this.playerTiaoW =\n          this.playerTiao.offsetWidth - this.playerYuan.offsetWidth)\n      this.playStart(0, isAdd)\n    } else {\n      this.playerDiv &&\n        L.DomUtil.addClass(this.playerDiv, 'truckplayer-display-none')\n    }\n    if (isAdd === undefined) {\n      isAdd = this.options.playObjLabelItems.includes('track')\n    }\n    if (this.trackInfo_leftBtn && this.trackInfo_rightBtn) {\n      L.DomUtil.removeClass(this.trackInfo_leftBtn, 'truckplayer-display-none')\n      L.DomUtil.removeClass(this.trackInfo_rightBtn, 'truckplayer-display-none')\n      L.DomUtil.removeClass(this.trackInfo_leftBtn, 'truckplayer-display-block')\n      L.DomUtil.removeClass(\n        this.trackInfo_rightBtn,\n        'truckplayer-display-block'\n      )\n      if (Object.keys(this.playTrackItems).length > this.trackInfoViewCount) {\n        L.DomUtil.addClass(this.trackInfo_leftBtn, 'truckplayer-display-block')\n        L.DomUtil.addClass(this.trackInfo_rightBtn, 'truckplayer-display-block')\n      } else {\n        L.DomUtil.addClass(this.trackInfo_leftBtn, 'truckplayer-display-none')\n        L.DomUtil.addClass(this.trackInfo_rightBtn, 'truckplayer-display-none')\n      }\n    }\n    if (this.shipListBtn) {\n      document\n        .querySelector('.playShipList')\n        ?.classList.add('truckplayer-display-none')\n    }\n  }\n\n  /**\n   * 创建船舶图标\n   * @param latlngs\n   * @param options\n   * @returns\n   */\n  _creatPlayObj(latlngs: L.LatLng[], options?: any): L.PolylineDecorator {\n    const color = this.playObjBMD[`${options.mmsi}`] ? '#e539cf' : '#ffff66'\n    const length = options.length || 0\n    const width = options.width || 0\n    const pathOptions: L.PathOptions = {\n      fillOpacity: 1,\n      stroke: true,\n      weight: 1,\n      color: '#222222',\n      fill: true,\n      fillColor: color,\n    }\n    if (options) {\n      if (options.lineColor) pathOptions.color = options.lineColor\n      if (options.color) pathOptions.fillColor = options.color\n    }\n\n    return L.polylineDecorator(latlngs as any, {\n      patterns: [\n        {\n          offset: -30,\n          symbol: trackShipSymbol({\n            pixelSize: 24,\n            headAngle: 40,\n            pathOptions,\n            ship: {\n              length,\n              width,\n            },\n            shipTemplaterThree: this.options.shipTemplaterThree,\n            shipTemplaterZoom: this.options.shipTemplaterZoom,\n          }),\n        },\n      ],\n      zIndexOffset: 1000,\n    })\n  }\n\n  /**\n   * 跟随绘制船舶显示信息\n   * @param latLng\n   * @param ship\n   * @param dataInfo\n   * @param index\n   * @returns\n   */\n  _creatOrUpdatePlayObjLable(\n    latLng: L.LatLng,\n    ship: any,\n    dataInfo: any,\n    index: number\n  ): L.Marker {\n    let labelContent = '' // 标签内容\n    let playObjLabel = dataInfo.playObjLabel // 播放对象标签\n    const additionalData = dataInfo.dataInfo[index] // 额外的数据信息\n    ship = Object.assign({}, ship, additionalData)\n    // 标签项\n    for (const item of this.options.playObjLabelItems) {\n      let value = ''\n      switch (item.toLowerCase()) {\n        case 'name':\n          value =\n            ship.custom_name || ship.cnname || ship.name || ship.shipName || ''\n          break\n        case 'mmsi':\n          value = ship.mmsi || ship.MMSI || ship.Mmsi || ''\n          break\n        case 'sog':\n          value = ship.sog || ''\n          break\n        case 'hdg':\n          value = ship.hdg || ''\n          break\n        case 'cog':\n          value = ship.cog || ''\n          break\n        default:\n          value = ship[item] || ''\n      }\n      if (value) {\n        const template = this._playObjLabelTemplater[item.toLowerCase()]\n        if (template) {\n          labelContent += template.replace('{value}', value)\n        }\n      }\n    }\n    // 如果存在标签，则更新位置和内容\n    if (playObjLabel) {\n      playObjLabel.setLatLng(latLng)\n      playObjLabel._tooltip._container.innerHTML = labelContent\n    } else {\n      const markerOptions = {\n        icon: L.icon({\n          iconUrl:\n            'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjY1RTYzOTA2ODZDRjExREJBNkUyRDg4N0NFQUNCNDA3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFENzY1MUQyODUzNzExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFENzY1MUQxODUzNzExRTU4RTQwRkQwODFEOUZEMEE3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTk5NzA1OGEtZDI3OC00NDZkLWE4ODgtNGM4MGQ4YWI1NzNmIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRkZmQxMGMtY2NlNS0xMTc4LWE5OGQtY2NkZmM5ODk5YWYwIi8+IDxkYzp0aXRsZT4gPHJkZjpBbHQ+IDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Z2x5cGhpY29uczwvcmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6dGl0bGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+bwCVTQAAARZJREFUeNqclQERwyAMRaEGhoRKmAQkVEIlIKESJgEJSNgcVELngClgcBd2LCWBkrt/t63JCwlLKkIIAiuaijJRe1RASr+tyecUVwHpqKMCwUo+moRBxnBR6wkGJ6JOYKMeRNlJdwzDpXlcRpEUQ48frFKez9mYC8LJ1/zQUX1ggLgtLj/460ELRLTGT1LKdOTSXqLfjuLzbUq9QQ6zGLVamQnYUaLCcRMwPyjH1nEOg76/qdtkb5SYFNsaI1f+36C/lvDV3ARc0ROP0zII8vnCcC/cAMxQK0hBpl6Qay3H5UJ5ioUBcOuA6eba7uyfqcY0xqW2WS0Z0zF/O3ozqSEYAGdotudASRICWIs77w4bZuf8vgIMAAI1tNMVERhgAAAAAElFTkSuQmCC',\n          iconAnchor: new L.Point(5, 10),\n          iconSize: [0, 0],\n        }),\n      }\n      const marker = L.marker(latLng, markerOptions)\n        .bindTooltip(labelContent, {\n          direction: 'auto',\n          offset: new L.Point(0, -30),\n          opacity: 0.7,\n          permanent: true,\n          className: 'trackPlay_label_tooltip unvisiable',\n        })\n        .openTooltip()\n        .off('click')\n        .addTo(this._map)\n      playObjLabel = marker\n    }\n\n    this.options.showPlayObjLable && this.setPlayObjLabelShow(true)\n    return playObjLabel\n  }\n\n  setPlayObjLabelShow(show: boolean): void {\n    this.options.showPlayObjLable = show\n    if (show) {\n      Array.from(document.querySelectorAll('.trackPlay_label:not(.unvisiable)'))\n        .filter((label: any) =>\n          label.parentElement.classList.contains('unvisiable')\n        )\n        .forEach((label: any) =>\n          label.parentElement.classList.remove('unvisiable')\n        )\n    } else {\n      document\n        .querySelectorAll('.trackPlay_label_tooltip')\n        .forEach((tooltip) => tooltip.classList.add('unvisiable'))\n    }\n  }\n\n  setShipWithNoSignalShow(show: boolean): void {\n    this.options.isVisiableWithNoSignal = show\n  }\n\n  setPlayObjLabelContent(items: string[]): void {\n    this.setPlayObjLabelShow(false)\n    this.options.playObjLabelItems = items\n    document.querySelectorAll('.trackPlay_label').forEach((label) => {\n      label.classList.add('unvisiable')\n    })\n    for (const item of items) {\n      document\n        .querySelectorAll(`.unvisiable.trackPlay_label_${item}`)\n        .forEach((label) => {\n          label.classList.remove('unvisiable')\n        })\n    }\n    this.setPlayObjLabelShow(true)\n  }\n\n  _supplementLatLng(data: any): any {\n    let isAdd = false\n    let supplementData: any = null\n    const trackId = data.trackId\n    if (data.isAdd) {\n      supplementData = this.playTrackItems[trackId]\n    }\n    if (!supplementData) {\n      isAdd = true\n      supplementData = {\n        ship: null,\n        minTime: null,\n        maxTime: null,\n        data: {},\n        dataInfo: {},\n        playObj: null,\n      }\n      supplementData.ship = data.ship\n    }\n\n    const points = data.data\n    const numPoints = points.length || 0\n    if (numPoints > 0) {\n      // 假设 utc 是时间戳，需要转换为实际时间\n      const firstUtc = points[0].utc\n      const lastUtc = points[numPoints - 1].utc\n      if (isAdd) {\n        supplementData.minTime = 1000 * firstUtc // 转换为毫秒\n        supplementData.maxTime = 1000 * lastUtc\n      } else {\n        supplementData.minTime = Math.min(\n          supplementData.minTime,\n          1000 * firstUtc\n        )\n        supplementData.maxTime = Math.max(\n          supplementData.maxTime,\n          1000 * lastUtc\n        )\n      }\n      if (\n        supplementData.minTime < 1000000000000 ||\n        supplementData.maxTime < 1000000000000 ||\n        supplementData.minTime > 2000000000000 ||\n        supplementData.maxTime > 2000000000000\n      ) {\n        return console.error('时间戳非法!')\n      }\n\n      // 补充数据\n      for (let i = 0; i < numPoints; i++) {\n        const point = points[i]\n        if (point.lon) point.lng = point.lon // 统一使用 lng\n        if (point.lng) point.lon = point.lng // 统一使用 lat\n        supplementData.dataInfo[1000 * point.utc] = point\n        supplementData.data[1000 * point.utc] = L.latLng(point.lat, point.lng)\n      }\n    }\n    return supplementData\n  }\n\n  // 基于位置的播放逻辑\n  _playByPosition(isForcedPlay = false) {\n    if (this.playState) {\n      // 如果提供了有效的position参数，则使用它；否则根据播放速度增加当前时间位置\n      if (!isForcedPlay) {\n        this.currentTimePosition +=\n          this.playSpeedOne * this.playSpeed * this.options.playFrequency\n      }\n      if (this.currentTimePosition > this.maxTime) {\n        this.currentTimePosition = this.maxTime\n        console.log('播放已结束！')\n        this.playState = false\n      } else {\n        // 存储需要处理的轨迹ID列表\n        const tracksToProcess = []\n        // 遍历播放轨迹项\n        for (const trackId in this.playTrackItems) {\n          const trackData = this.playTrackItems[trackId].data\n          if (trackData) {\n            // 检查当前时间点是否存在轨迹数据\n            if (this.currentTimePosition in trackData) {\n              // 如果存在数据，直接使用\n            } else {\n              // 如果当前时间点没有数据，且不在轨迹的最小和最大时间范围内，则进行动态补点\n              if (\n                this.currentTimePosition < trackData.minTime ||\n                this.currentTimePosition > trackData.maxTime\n              ) {\n                // 如果时间超出范围，不进行处理\n              } else if (!this.isMousedown) {\n                // 获取当前时间点附近的GPS轨迹数据，并进行动态补点\n                const [prevGPS, nextGPS] = this._getNearGPSTracks(\n                  trackId,\n                  this.currentTimePosition\n                )\n                this._dongtaibudian(trackId, prevGPS, nextGPS)\n              }\n            }\n\n            // 根据是否存在当前时间点的数据，决定是否需要添加或更新播放对象\n            if (this.currentTimePosition in trackData) {\n              if (this.playObjHMD[trackId]) {\n                // 如果存在播放对象，移除并处理历史轨迹\n                this.removePlayObjByItem(trackData)\n                this._removeShipHistoryTrack(trackId)\n              } else {\n                tracksToProcess.push(trackId)\n              }\n            } else if (this.playObjHMD[trackId]) {\n              // 如果不存在数据，但存在播放对象，移除并处理历史轨迹\n              this.removePlayObjByItem(trackData)\n              this._removeShipHistoryTrack(trackId)\n            } else if (\n              this.playObjBMD[trackId] ||\n              this.options.isVisiableWithNoSignal ||\n              this.options.isVisiableOutOfBounds\n            ) {\n              tracksToProcess.push(trackId)\n            }\n          }\n        }\n        // 遍历有效船只数组，更新播放对象和历史轨迹\n        for (const shipId of tracksToProcess) {\n          const currentShipItem = this.playTrackItems[shipId]\n          const currentGPSTime = this._getPreviousGPSTimeByCTime(\n            shipId,\n            this.currentTimePosition\n          )\n          let currentPoint = currentShipItem.data[this.currentTimePosition]\n          let previousPoint =\n            currentShipItem.data[\n              this.currentTimePosition - this.options.playFrequency\n            ]\n\n          if (!previousPoint) continue\n          // 如果当前点或前一个点存在，更新播放对象和标签\n          if (\n            currentPoint ||\n            (this.options.isVisiableWithNoSignal &&\n              (this.options.isVisiableOutOfBounds ||\n                this.currentTimePosition <= currentShipItem.maxTime) &&\n              (currentPoint = currentShipItem.dataInfo[currentGPSTime]))\n          ) {\n            currentPoint = CanvasShipUtils.GPSEncryptByMapToLatLng(\n              currentPoint,\n              this._map\n            )\n            previousPoint = CanvasShipUtils.GPSEncryptByMapToLatLng(\n              previousPoint,\n              this._map\n            )\n            if (!currentShipItem.playObj) {\n              this.playTrackItems[shipId].playObj = this._creatPlayObj(\n                [\n                  [previousPoint.lat, previousPoint.lng],\n                  [currentPoint.lat, currentPoint.lng],\n                ] as any,\n                currentShipItem.ship\n              )\n              this.playTrackItems[shipId].playObj.addTo(this._map)\n            }\n\n            const trackPoints = [\n              [previousPoint.lat, previousPoint.lng],\n              [currentPoint.lat, currentPoint.lng],\n            ]\n            this._setItem_HDG(shipId, currentGPSTime)\n            // if (currentGPSTime) {\n            // }\n\n            this.playTrackItems[shipId].playObj.setPaths(trackPoints)\n            this.playTrackItems[shipId].playObjLabel =\n              this._creatOrUpdatePlayObjLable(\n                trackPoints[1] as any,\n                this.currentTimePosition,\n                currentShipItem,\n                currentGPSTime\n              )\n\n            if (currentGPSTime) {\n              this._updateTrackInfo(shipId, currentGPSTime)\n              if (this.options.playGPSCallBack) {\n                setTimeout(() => {\n                  this.options.playGPSCallBack &&\n                    this.options.playGPSCallBack(\n                      this.playTrackItems[shipId].dataInfo[currentGPSTime],\n                      this.playTrackItems[shipId],\n                      currentGPSTime\n                    )\n                }, 10) // Timeout duration in milliseconds\n              }\n              if (this.options.isVisiableShipTrack) {\n                this._drawShipHistoryTrack(shipId, this.currentTimePosition)\n              }\n            }\n          } else {\n            // 如果当前点不存在，移除播放对象和历史轨迹\n            if (this.playTrackItems[shipId].playObj) {\n              this.removePlayObjByItem(this.playTrackItems[shipId])\n              this._removeShipHistoryTrack(shipId)\n            }\n          }\n        }\n\n        // 更新播放器位置和回调\n        this._setPlayerPosition()\n\n        // 如果存在播放回调，执行回调\n        if (this.options.playCallBack) {\n          setTimeout(() => {\n            this.options.playCallBack &&\n              this.options.playCallBack(\n                this.currentTimePosition,\n                this._getCurrentTimeShipInfo(this.currentTimePosition)\n              )\n          })\n        }\n\n        // 如果播放状态为真，且没有提供position参数，则继续播放\n        if (this.playState && !isForcedPlay) {\n          setTimeout(() => {\n            this._playByPosition()\n          }, this.options.playFrequency)\n        } else {\n          this.playState = false\n        }\n      }\n    }\n  }\n\n  /**\n   * 补充间隔\n   * @param trackId\n   * @param startGPS\n   * @param endGPS\n   */\n  _dongtaibudian(trackId: string, startGPS: any, endGPS: any): void {\n    if (startGPS && endGPS) {\n      if (\n        this.maxSupplementPointInterval > 0 &&\n        endGPS.utc - startGPS.utc > this.maxSupplementPointInterval\n      ) {\n        // 间隔超过最大补充点间隔，不进行补充\n      } else {\n        // 计算补点的时间间隔和坐标变化率\n        const timeDiff =\n          (1000 * (endGPS.utc - startGPS.utc)) / this.options.playFrequency\n        const latChangeRate = (endGPS.lat - startGPS.lat) / timeDiff\n        const lngChangeRate = (endGPS.lng - startGPS.lng) / timeDiff\n        // 初始化补点的中间变量\n        for (let i = 0; i < timeDiff; i++) {\n          const currentTime =\n            startGPS.utc * 1000 + i * this.options.playFrequency\n          const newLat = startGPS.lat + i * latChangeRate\n          const newLng = startGPS.lng + i * lngChangeRate\n          const newLatLng = L.latLng(newLat, newLng)\n          // 将补点坐标存入对应trackId的数据中\n          this.playTrackItems[trackId].data[currentTime] = newLatLng\n        }\n      }\n    }\n  }\n\n  // 根据当前时间获取最近的GPS时间\n  _getPreviousGPSTimeByCTime(trackId: string, currentTime: number): number {\n    if (!this.playTrackItems[trackId]) {\n      console.log(`trackId is null=${trackId}`)\n      return 0\n    }\n    const dataInfo = this.playTrackItems[trackId].dataInfo\n\n    if (currentTime && dataInfo) {\n      if (currentTime in dataInfo) return currentTime\n      const keys = Object.keys(dataInfo)\n      for (let i = 0; i < keys.length; i++) {\n        const keyTime = Number(keys[i])\n        if (keyTime > currentTime && 0 == keyTime) return 0\n        if (keyTime > currentTime) return Number(keys[i - 1])\n      }\n    }\n    return 0\n  }\n  // 根据当前时间获取最近的GPS轨迹点\n  _getNearGPSTracks(trackId: string, currentTime: number) {\n    const result = [null, null]\n    if (this.playTrackItems[trackId]) {\n      const dataInfo = this.playTrackItems[trackId].dataInfo\n      const keys = Object.keys(dataInfo)\n      for (let i = 0; i < keys.length - 1; i++) {\n        const prevGPS = dataInfo[keys[i]]\n        const nextGPS = dataInfo[keys[i + 1]]\n        if (\n          currentTime > prevGPS.utc * 1000 &&\n          currentTime < nextGPS.utc * 1000\n        ) {\n          result[0] = prevGPS\n          result[1] = nextGPS\n          break\n        }\n      }\n    } else {\n      console.log(`trackId is null=${trackId}`)\n    }\n    return result\n  }\n\n  // 获取当前时间的船舶历史轨迹\n  _getCurrentTimeShipHistoryTrack(\n    trackId: string,\n    currentTime: number\n  ): L.LatLng[] {\n    let trackData: L.LatLng[] = []\n    if (this.playTrackItems[trackId]) {\n      const dataInfo = this.playTrackItems[trackId].dataInfo\n      const keys = Object.keys(dataInfo)\n      if (keys.length > 0 && Number(keys[0]) < currentTime) {\n        for (\n          let i = 0;\n          i < keys.length && Number(keys[i]) <= currentTime;\n          i++\n        ) {\n          const latLng = CanvasShipUtils.GPSEncryptByMapToLatLng(\n            dataInfo[keys[i]],\n            this._map\n          )\n          if (\n            this.options.shipTrackMaxInterval > 0 &&\n            trackData.length > 0 &&\n            Number(keys[i]) - Number(keys[i - 1]) >\n              this.options.shipTrackMaxInterval * 1000\n          ) {\n            trackData = [] // 重置轨迹数组\n          }\n          trackData.push(latLng)\n        }\n      }\n    }\n    this.shipHistoryTrackData[trackId] = trackData\n    return trackData\n  }\n\n  // 获取当前时间的船舶信息\n  _getCurrentTimeShipInfo(currentTime: number): any {\n    const shipInfo: any = {}\n    for (const trackId in this.playTrackItems) {\n      const trackItem = this.playTrackItems[trackId]\n      const currentGPS = trackItem.data[currentTime]\n      const previousTime = this._getPreviousGPSTimeByCTime(\n        trackItem.trackid,\n        currentTime\n      )\n      const previousGPS = previousTime ? trackItem.dataInfo[previousTime] : null\n      const shipData = Object.assign({}, trackItem.ship, {\n        lat: currentGPS ? currentGPS.lat : null,\n        lng: currentGPS ? currentGPS.lng : null,\n        utc: currentTime,\n        ...(previousGPS || {}),\n      })\n      shipInfo[trackId] = shipData\n    }\n    return shipInfo\n  }\n  // 设置船舶历史轨迹的显示\n  setShipHistoryTrackShow(show: boolean): void {\n    this.options.isVisiableShipTrack = show\n    if (show) {\n      // 如果需要开始播放或者当前不在播放状态\n      if (!this.playSate) {\n        this.playStart(0, false)\n      }\n    } else {\n      this._removeShipHistoryTrack()\n    }\n  }\n\n  // 设置船舶历史轨迹的样式\n  setShipHistoryTrackStyle(style: any) {\n    this.shipHistoryTrackStyle = Object.assign(\n      {},\n      this.shipHistoryTrackStyle,\n      style\n    )\n    for (const trackId in this.shipHistoryTrackLine) {\n      this.shipHistoryTrackLine[trackId].setStyle(this.shipHistoryTrackStyle)\n    }\n    return this.shipHistoryTrackStyle\n  }\n\n  // 绘制船舶历史轨迹\n  _drawShipHistoryTrack(trackId: string, currentTime: number): void {\n    const currentTrack = this._getCurrentTimeShipHistoryTrack(\n      trackId,\n      currentTime\n    )\n    const currentPos = this.playTrackItems[trackId].data[currentTime]\n    if (currentPos) {\n      const latLng = CanvasShipUtils.GPSEncryptByMapToLatLng(\n        currentPos,\n        this._map\n      )\n      currentTrack.push(latLng)\n    }\n    if (currentTrack.length >= 2) {\n      if (this.shipHistoryTrackLine[trackId]) {\n        this.shipHistoryTrackLine[trackId].setLatLngs(currentTrack)\n      } else {\n        this.shipHistoryTrackLine[trackId] = L.polyline(\n          currentTrack,\n          this.shipHistoryTrackStyle\n        ).addTo(this._map)\n      }\n    }\n  }\n\n  // 移除船舶历史轨迹\n  _removeShipHistoryTrack(trackId?: string): void {\n    if (trackId) {\n      if (this.shipHistoryTrackLine[trackId]) {\n        this._map.removeLayer(this.shipHistoryTrackLine[trackId])\n        delete this.shipHistoryTrackLine[trackId]\n      }\n    } else {\n      for (const id in this.shipHistoryTrackLine) {\n        this._removeShipHistoryTrack(id)\n      }\n    }\n  }\n\n  // 重置最小最大时间\n  _resetMinMaxTime(\n    minTime?: number,\n    maxTime?: number,\n    resetCurrentTime?: boolean\n  ): void {\n    this.minTime = 0\n    this.maxTime = 0\n    if (this.playerCtime) this.playerCtime.innerHTML = ''\n    if (this.playerEtime) this.playerEtime.innerHTML = ''\n    if (minTime && maxTime) {\n      this.minTime = minTime\n      this.maxTime = maxTime\n    } else {\n      if (Object.keys(this.playTrackItems).length > 0) {\n        for (const item in this.playTrackItems)\n          0 == this.minTime\n            ? (this.minTime = this.playTrackItems[item].minTime)\n            : (this.minTime = Math.min(\n                this.minTime,\n                this.playTrackItems[item].minTime\n              )),\n            0 == this.maxTime\n              ? (this.maxTime = this.playTrackItems[item].maxTime)\n              : (this.maxTime = Math.max(\n                  this.maxTime,\n                  this.playTrackItems[item].maxTime\n                ))\n      }\n    }\n    if (resetCurrentTime) {\n      this.currentTimePosition = this.minTime\n    }\n    if (this.minTime !== 0 && this.playerCtime) {\n      this.playerCtime.innerHTML = CanvasShipUtils.dataFormat(\n        new Date(this.currentTimePosition),\n        'YYYY-MM-DD HH:mm:ss'\n      )\n    }\n    if (this.maxTime !== 0 && this.playerEtime) {\n      this.playerEtime.innerHTML = `/${CanvasShipUtils.dataFormat(\n        new Date(this.maxTime),\n        'YYYY-MM-DD HH:mm:ss'\n      )}`\n    }\n  }\n  // 创建播放器的 HTML 元素\n  _createPlayerHtml(): void {\n    this.playerDiv = L.DomUtil.create(\n      'div',\n      'truckplayer truckplayer-display-none',\n      this._map._container\n    )\n    L.DomEvent.disableClickPropagation(this.playerDiv)\n    L.DomEvent.disableScrollPropagation(this.playerDiv)\n\n    this.playerTitleDiv = L.DomUtil.create(\n      'div',\n      'truckplayer-title float-left',\n      this.playerDiv\n    )\n    this.playerTitleOption = L.DomUtil.create(\n      'div',\n      'title-option float-left',\n      this.playerTitleDiv\n    )\n    this.playerTitleOption.innerHTML = this._getPlayOptionHtml()\n\n    this.playerTitleBtn = L.DomUtil.create(\n      'div',\n      'title-btn float-right',\n      this.playerTitleDiv\n    )\n    // 全屏显示控件\n    // this.playerTitleFullScreen = L.DomUtil.create(\n    //   'div',\n    //   'title-fullScreen float-right',\n    //   this.playerTitleDiv\n    // )\n\n    this.playerTiao = L.DomUtil.create(\n      'div',\n      'truckplayer-tiao float-left',\n      this.playerDiv\n    )\n    this.playerYuan = L.DomUtil.create(\n      'div',\n      'truckplayer-yuan',\n      this.playerTiao\n    )\n    this.playerJindu = L.DomUtil.create(\n      'div',\n      'truckplayer-jindu',\n      this.playerTiao\n    )\n\n    this.playerOptionDiv = L.DomUtil.create(\n      'div',\n      'truckplayer-option float-left',\n      this.playerDiv\n    )\n    this.playBtn = L.DomUtil.create(\n      'button',\n      'truckplayer-play start float-left',\n      this.playerOptionDiv\n    )\n\n    this.playerTimeDiv = L.DomUtil.create(\n      'div',\n      'truckplayer-time float-left',\n      this.playerOptionDiv\n    )\n    this.playerCtime = L.DomUtil.create(\n      'div',\n      'truckplayer-ctime float-left unselectde',\n      this.playerTimeDiv\n    )\n    this.playerCtime.title = '当前时间'\n\n    this.playerEtime = L.DomUtil.create(\n      'div',\n      'truckplayer-etime float-left unselectde',\n      this.playerTimeDiv\n    )\n    this.playerEtime.title = '截止时间'\n\n    this.playSpeedDiv = L.DomUtil.create(\n      'div',\n      'playSpeed float-right',\n      this.playerOptionDiv\n    )\n    this.playSpeedDiv.title = '倍速'\n\n    this.playSpeedText = L.DomUtil.create(\n      'div',\n      'playSpeed-txt float-left unselectde',\n      this.playSpeedDiv\n    )\n    this.playSpeedImg = L.DomUtil.create(\n      'div',\n      'playSpeed-img up float-left',\n      this.playSpeedDiv\n    )\n    this.playSpeedSelectUL = L.DomUtil.create(\n      'ul',\n      'playSpeed-select truckplayer-display-none',\n      this.playerOptionDiv\n    )\n    this.playSpeedSelectlis = []\n\n    this.playSpeedList.forEach((speed) => {\n      const li = L.DomUtil.create(\n        'li',\n        this.playSpeed === speed ? 'active' : '',\n        this.playSpeedSelectUL\n      )\n      li.setAttribute('playSpeed', speed.toString())\n      li.innerHTML = `${speed}X`\n      this.playSpeedSelectlis.push(li)\n    })\n\n    this.playSpeedText.innerHTML =\n      this.playSpeed === 1 ? '倍速' : `${this.playSpeed}X`\n\n    this.shipListBtn = L.DomUtil.create(\n      'div',\n      'trackinfo-sh-btn playSpeed float-right',\n      this.playerOptionDiv\n    )\n    this.shipListBtn.title = '船舶列表'\n    this.shipListBtnText = L.DomUtil.create(\n      'div',\n      'unselectde',\n      this.shipListBtn\n    )\n    this.shipListBtnText.innerHTML = '船舶列表'\n\n    // 创建轨迹信息显示区域\n    if (this.trackInfoSHBtn) {\n      this.trackInfoDiv = L.DomUtil.create(\n        'div',\n        'playTrackInfo truckplayer-display-none',\n        this.playerDiv\n      )\n      this.trackInfo_leftBtn = L.DomUtil.create(\n        'div',\n        'btn left-btn float-left truckplayer-display-none',\n        this.trackInfoDiv\n      )\n      this.trackInfo_center = L.DomUtil.create(\n        'div',\n        'center-tracks float-left',\n        this.trackInfoDiv\n      )\n      this.trackInfo_rightBtn = L.DomUtil.create(\n        'div',\n        'btn right-btn float-left truckplayer-display-none',\n        this.trackInfoDiv\n      )\n      L.DomEvent.disableClickPropagation(this.trackInfoDiv)\n      this.trackInfoViewCount = 2\n      this.trackInfoCIndex = 0\n    }\n\n    // 创建船舶列表显示区域\n    if (this.shipListBtn) {\n      this.shipListDiv = L.DomUtil.create(\n        'div',\n        'playShipList truckplayer-display-none',\n        this._map._container\n      )\n      this.shipList_title = L.DomUtil.create(\n        'div',\n        'playShipListTitle',\n        this.shipListDiv\n      )\n      this.shipList_content = L.DomUtil.create(\n        'div',\n        'playShipListContent',\n        this.shipListDiv\n      )\n      this.shipList_foot = L.DomUtil.create(\n        'div',\n        'playShipListFoot',\n        this.shipListDiv\n      )\n      L.DomEvent.disableClickPropagation(this.shipListDiv)\n      L.DomEvent.disableScrollPropagation(this.shipListDiv)\n      new L.Draggable(this.shipListDiv, this.shipList_title).enable()\n      this.shipList_title.innerHTML = `\n                <span class=\"titleText\">船舶列表</span>\n                <div class=\"titleBtn\">\n                    <div style=\"position: absolute;\">\n                        <input type=\"text\" placeholder=\"搜索船舶\"/>\n                        <span class=\"search\"></span>\n                    </div>\n                    <span class=\"clear\"></span>\n                    <span class=\"titleClose\"></span>\n                </div>\n            `\n      this.shipList_content.innerHTML = this._getShipListHtml()\n      this.shipList_foot.innerHTML = `<input type=\"button\" value=\"导出\"/>`\n    }\n\n    // 初始化播放器的其他属性\n    this.playerTiaoW = this.playerTiao.offsetWidth - this.playerYuan.offsetWidth\n    this.playerPercentage = 0\n    this.playerMinValue = 0\n    this.playerMaxValue = 100\n\n    // 初始化播放器行为\n    this._buildPlayer()\n    if (this.draggable) {\n      const wasEnabled = this.draggable._enabled\n      this.draggable = new L.Draggable(this.playerDiv, this.playerTitleDiv)\n      wasEnabled ? this.draggable.enable() : this.draggable.disable()\n    } else {\n      this.draggable = new L.Draggable(this.playerDiv, this.playerTitleDiv)\n      this.draggable.enable()\n    }\n  }\n  // 生成播放器选项的 HTML\n  _getPlayOptionHtml(): string {\n    const playObjPlayerItems = this.options.playObjPlayerItems\n    const playObjLabelItems = this.options.playObjLabelItems\n    let html = ''\n    for (const item of playObjPlayerItems) {\n      const isChecked = playObjLabelItems.includes(item)\n      html += `\n                <li el-data=\"${item}\">\n                    <input type=\"checkbox\" ${\n                      isChecked ? 'checked=\"checked\"' : ''\n                    } />\n                    ${item}\n                </li>\n            `\n    }\n    return `<ul>${html}</ul>`\n  }\n\n  // 生成船舶列表的 HTML\n  _getShipListHtml(): string {\n    const shipListLength = Object.keys(this.playTrackItems).length\n    // $(this.shipList_title).find('.titleText').text(`船舶列表(${shipListLength})`)\n    if (this.shipList_title && this.shipList_title.querySelector) {\n      const titleElement = this.shipList_title.querySelector('.titleText')\n      if (titleElement) {\n        titleElement.textContent = `船舶列表(${shipListLength})`\n      }\n    }\n\n    const shipListHtml = `\n            <div class=\"contentTitle\">\n                <table cellspacing=\"0\">\n                    <tr>\n                        <td class=\"shipList_td1\">序号</td>\n                        <td class=\"shipList_td2\">船名</td>\n                        <td class=\"shipList_td3\">MMSI</td>\n                        <td class=\"shipList_td4\">船舶类型</td>\n                        <td class=\"shipList_td5\">长 x 宽</td>\n                        <td class=\"shipList_td6\">进入时间</td>\n                        <td class=\"shipList_td7\">离开时间</td>\n                        <td class=\"shipList_td8\">操作<span></span></td>\n                    </tr>\n                </table>\n            </div>\n        `\n\n    let shipListContentHtml = ''\n    let index = 1\n    for (const trackId in this.playTrackItems) {\n      const trackItem = this.playTrackItems[trackId]\n      const ship = trackItem.ship\n      const shipName = ship.shipname || ship.name || ''\n      const mmsi = ship.mmsi || ship.shipid\n      const shipTypeCN = CanvasShipUtils.getShipTypeCN(ship.type) || ''\n      const dimensions =\n        ship.length && ship.width ? `${ship.length}*${ship.width}` : '--'\n      const entryTime = CommUtils.dataFormat(trackItem.minTime / 1000) || ''\n      const leaveTime = CommUtils.dataFormat(trackItem.maxTime / 1000) || ''\n\n      shipListContentHtml += `\n                <tr el-trackID=\"${trackId}\" el-data=\"${shipName.toLowerCase()}-|--|-${mmsi}\">\n                    <td class=\"shipList_td1\">${index++}</td>\n                    <td class=\"shipList_td2\" title=\"${shipName}\">${shipName}</td>\n                    <td class=\"shipList_td3\" title=\"${mmsi}\">${mmsi}</td>\n                    <td class=\"shipList_td4\" title=\"${shipTypeCN}\">${shipTypeCN}</td>\n                    <td class=\"shipList_td5\" title=\"${dimensions}\">${dimensions}</td>\n                    <td class=\"shipList_td6\" title=\"${entryTime}\">${entryTime}</td>\n                    <td class=\"shipList_td7\" title=\"${leaveTime}\">${leaveTime}</td>\n                    <td class=\"shipList_td8\"><span></span></td>\n                </tr>\n            `\n    }\n\n    return `${shipListHtml}<div class=\"contentContent\"><table cellspacing=\"0\">${shipListContentHtml}</table></div>`\n  }\n\n  // 更新船舶列表\n  _updateShipList(): void {\n    if (this.shipList_content) {\n      this.shipList_content.innerHTML = this._getShipListHtml()\n    }\n  }\n  // 轨迹信息轮播控制\n  _playTrackInfoCarousel(increment = 0): void {\n    const trackCount = Object.keys(this.playTrackItems).length\n    if (trackCount > 0) {\n      increment = increment || 0\n      increment = Math.round(increment)\n      this.trackInfoCIndex += increment\n      const indices = []\n      for (let i = 0; i < this.trackInfoViewCount; i++) {\n        let index = this.trackInfoCIndex + i\n        if (index >= trackCount || index < 0) {\n          index = Math.round(index % trackCount)\n        }\n        indices.push(Math.abs(index))\n      }\n      this.trackInfoCIndex > trackCount &&\n        (this.trackInfoCIndex = Math.round(this.trackInfoCIndex % trackCount))\n      this._addTrackInfo(indices)\n    }\n  }\n\n  // 添加轨迹信息\n  _addTrackInfo(indices: number[]): void {\n    if (this.trackInfoCenter) {\n      const trackKeys = Object.keys(this.playTrackItems)\n      this.trackInfoCenter.innerHTML = ''\n      for (const index of indices) {\n        if (index >= 0 && index < trackKeys.length) {\n          this._createTrackHtml(trackKeys[index])\n          this._updateTrackInfo(trackKeys[index])\n        }\n      }\n    }\n  }\n\n  // 创建轨迹信息的 HTML\n  _createTrackHtml(trackId: string): void {\n    const trackDiv = L.DomUtil.create(\n      'div',\n      'track float-left',\n      this.trackInfoCenter\n    )\n    trackDiv.id = `trackinfo_${trackId}`\n\n    const createInfoLine = (name: string, valueId: string) => {\n      const infoLineDiv = L.DomUtil.create(\n        'div',\n        'info-line float-left',\n        trackDiv\n      )\n      const nameDiv = L.DomUtil.create('div', 'info-name', infoLineDiv)\n      nameDiv.innerHTML = `${name}：`\n      const valueDiv = L.DomUtil.create('div', 'info-value', infoLineDiv)\n      valueDiv.id = valueId\n    }\n\n    createInfoLine('船名', `trackinfo_name_${trackId}`)\n    createInfoLine('MMSI', `trackinfo_mmsi_${trackId}`)\n    createInfoLine('船首向', `trackinfo_hdg_${trackId}`)\n    createInfoLine('速度', `trackinfo_sog_${trackId}`)\n    createInfoLine('航迹向', `trackinfo_cog_${trackId}`)\n    createInfoLine('纬度', `trackinfo_lat_${trackId}`)\n    createInfoLine('经度', `trackinfo_lng_${trackId}`)\n    createInfoLine('状态', `trackinfo_status_${trackId}`)\n    createInfoLine('更新时间', `trackinfo_time_${trackId}`)\n  }\n\n  // 设置轨迹的 HDG（航向）\n  _setItem_HDG(trackId: string, time: number): void {\n    const dataInfo = this.playTrackItems[trackId].dataInfo\n    if (dataInfo) {\n      const symbolFactory =\n        this.playTrackItems[trackId].playObj._patterns[0].symbolFactory\n      symbolFactory.hdg = dataInfo[time].hdg\n    }\n  }\n\n  // 更新轨迹信息\n  _updateTrackInfo(trackId: string, time = 0): void {\n    const shipInfo = this.playTrackItems[trackId]?.ship\n    let currentData: any = null\n    if (shipInfo && this.playTrackItems[trackId].dataInfo) {\n      const dataInfo = this.playTrackItems[trackId].dataInfo\n      const keys = Object.keys(dataInfo)\n      if (keys.length > 0) {\n        if (!time) {\n          time = this._getPreviousGPSTimeByCTime(\n            trackId,\n            this.currentTimePosition\n          )\n        }\n        currentData = dataInfo[time]\n      }\n    }\n\n    if (shipInfo) {\n      const setHtmlValue = (id: string, value: string) => {\n        const trackinfoKey = document.querySelector(`#${id}`)\n        if (trackinfoKey) trackinfoKey.innerHTML = value\n      }\n      // 更新船只名称和MMSI\n      setHtmlValue(`trackinfo_name_${trackId}`, shipInfo.name || '')\n      setHtmlValue(`trackinfo_mmsi_${trackId}`, shipInfo.mmsi || '')\n\n      if (currentData) {\n        // 更新当前轨迹点的详细信息\n        setHtmlValue(`trackinfo_hdg_${trackId}`, `${currentData.hdg || ''}度`)\n        setHtmlValue(`trackinfo_sog_${trackId}`, `${currentData.sog || ''}节`)\n        setHtmlValue(`trackinfo_cog_${trackId}`, `${currentData.cog || ''}度`)\n        setHtmlValue(\n          `trackinfo_lat_${trackId}`,\n          CanvasShipUtils.latFormatter(currentData.lat)\n        )\n        setHtmlValue(\n          `trackinfo_lng_${trackId}`,\n          CanvasShipUtils.latFormatter(currentData.lng)\n        )\n        // 更新状态和时间\n        const status =\n          currentData.navistatus === null ? -1 : currentData.navistatus\n        setHtmlValue(\n          `trackinfo_status_${trackId}`,\n          CanvasShipUtils.getDisValue(status, 'naviStatus', 'zh_CN')\n        )\n\n        setHtmlValue(\n          `trackinfo_time_${trackId}`,\n          CanvasShipUtils.dataFormat(new Date(time), 'YYYY-MM-DD HH:mm:ss')\n        )\n      }\n    }\n  }\n\n  // 构建播放器\n  _buildPlayer(): void {\n    const _body = document.body\n    this.isMousedown = false\n\n    // 播放按钮点击事件\n    if (this.playBtn) {\n      this.playBtn.onclick = (): void => {\n        if (\n          this.playTrackItems &&\n          Object.keys(this.playTrackItems).length > 0\n        ) {\n          this.playStartOrStop()\n        }\n      }\n    }\n\n    // 轨迹圆圈鼠标按下事件\n    this.playerYuan.onmousedown = (): void => {\n      if (\n        this._checkLoadDataStatus() &&\n        this.playTrackItems &&\n        Object.keys(this.playTrackItems).length > 0\n      ) {\n        this.isMousedown = true\n        _body.onmousemove = (mouseEvent): void => {\n          this._setYuanPosition(mouseEvent)\n        }\n        if (this.playerDiv)\n          this.playerDiv.onmouseleave = (): void => {\n            if (this.isMousedown) {\n              this.isMousedown = false\n            }\n          }\n      }\n    }\n\n    // 鼠标弹起事件\n    _body.onmouseup = (): void => {\n      if (this.playTrackItems && Object.keys(this.playTrackItems).length > 0) {\n        this.isMousedown = false\n      }\n    }\n\n    // 轨迹条点击事件\n    if (this.playerTiao) {\n      this.playerTiao.onclick = (event): void => {\n        if (this._checkLoadDataStatus()) {\n          this.isMousedown = true\n          this._setYuanPosition(event)\n          this.isMousedown = false\n        }\n      }\n    }\n\n    // 播放速度按钮点击事件\n    if (this.playSpeedDiv)\n      this.playSpeedDiv.onclick = (): void => {\n        if (this._checkLoadDataStatus()) {\n          // $(this.playSpeedSelectUL).toggle(0, null)\n          const playSpeedSelectULDisplay = this.playSpeedSelectUL.style.display\n          if (\n            playSpeedSelectULDisplay === 'none' ||\n            playSpeedSelectULDisplay === ''\n          ) {\n            this.playSpeedSelectUL.style.display = 'block'\n          } else {\n            this.playSpeedSelectUL.style.display = 'none'\n          }\n        }\n      }\n\n    // 播放速度选择列表项点击事件\n    const speedListItems = document.querySelectorAll('.playSpeed-select li')\n    speedListItems.forEach((item) => {\n      item.addEventListener('click', (speedClickEvent) => {\n        if (this._checkLoadDataStatus()) {\n          const playSpeed =\n            (speedClickEvent.currentTarget as HTMLLIElement).getAttribute(\n              'playSpeed'\n            ) || 0\n          this.setPlaySpeed(Number(playSpeed))\n          this.playSpeedSelectUL.style.display = 'none'\n        }\n      })\n    })\n\n    // 播放器标题选项点击事件\n    if (this.playerTitleOption) {\n      const optionListItems = Array.from(\n        this.playerTitleOption.querySelectorAll('li')\n      )\n      optionListItems.forEach((item) => {\n        item.addEventListener('click', (optionClickEvent: any) => {\n          const targetLi = optionClickEvent.currentTarget as any\n          if (!targetLi) {\n            return\n          }\n          const inputElement = targetLi.querySelector('input')\n          const isChecked = inputElement.checked\n\n          if (optionClickEvent.target.nodeName !== 'INPUT') {\n            inputElement.checked = !isChecked\n          }\n\n          const dataAttr = targetLi.getAttribute('el-data')\n\n          switch (dataAttr) {\n            case 'area':\n              break\n            case 'track':\n              this.setShipHistoryTrackShow(isChecked)\n              break\n            default:\n              // 获取勾选的显示项\n              // eslint-disable-next-line no-case-declarations\n              const checkedList = Array.from(\n                targetLi.parentNode.querySelectorAll('input:checked')\n              )\n              // eslint-disable-next-line no-case-declarations\n              const datas = checkedList\n                .filter((item: any) => {\n                  return item.parentNode.getAttribute('el-data') !== 'area'\n                })\n                .map((item: any) => item.parentNode.getAttribute('el-data'))\n\n              this.setPlayObjLabelContent(datas)\n          }\n\n          if (typeof this.options.labelOptionCallback === 'function') {\n            this.options.labelOptionCallback(dataAttr, isChecked)\n          }\n        })\n      })\n    }\n\n    // 全屏按钮点击事件\n    if (this.playerTitleFullScreen)\n      this.playerTitleFullScreen.onclick = (): void => {\n        this.setFullScreen()\n        if (this.options.fullScreenCallback) {\n          this.options.fullScreenCallback()\n        }\n      }\n\n    // 关闭按钮点击事件\n    if (this.playerTitleBtn)\n      this.playerTitleBtn.onclick = (): void => {\n        this.closeTrackPlay()\n      }\n\n    // 轨迹信息左右切换按钮点击事件\n    if (this.trackInfoSHBtn) {\n      this.trackInfoSHBtn.onclick = (): void => {\n        if (this._checkLoadDataStatus()) {\n          const { x, y } = CommUtils.getElementPos(this._map._container)\n          if (this.trackInfoDiv) {\n            this.trackInfoDiv.style.left = `${50 + x}px`\n            this.trackInfoDiv.style.top = `${100 + y}px`\n            this.trackInfoDiv.style.display = 'none'\n          }\n          this._playTrackInfoCarousel()\n        }\n      }\n    }\n\n    if (this.trackInfoSHBtn) {\n      // 轨迹信息左按钮点击事件\n      this.trackInfo_leftBtn.onclick = (): void => {\n        this._playTrackInfoCarousel(-1)\n      }\n\n      // 轨迹信息右按钮点击事件\n      this.trackInfo_rightBtn.onclick = (): void => {\n        this._playTrackInfoCarousel(1)\n      }\n    }\n\n    // 船舶列表按钮点击事件\n    if (this.shipListBtn) {\n      this.shipListBtn.onclick = (): void => {\n        if (this._checkLoadDataStatus() && this.shipListDiv) {\n          const shipListDisplay = this.shipListDiv.style.display\n          if (!shipListDisplay || shipListDisplay === 'none') {\n            this.shipListDiv.classList.remove('truckplayer-display-none')\n            this._updateShipList()\n          } else {\n            this.shipListDiv.classList.add('truckplayer-display-none')\n          }\n        }\n      }\n    }\n\n    // 船舶列表标题关闭按钮点击事件\n    if (this.shipList_title) {\n      // 获取titleClose元素\n      const titleCloseElements =\n        this.shipList_title.querySelectorAll('.titleClose')\n\n      // 为每个.titleClose元素添加点击事件监听器\n      titleCloseElements.forEach((titleCloseElement) => {\n        titleCloseElement.addEventListener('click', () => {\n          // 当点击事件触发时，给shipListDiv元素添加truckplayer-display-none类\n          this.shipListDiv &&\n            this.shipListDiv.classList.add('truckplayer-display-none')\n        })\n      })\n    }\n\n    // 船舶列表标题按钮输入事件\n    if (this.shipList_title) {\n      const titleBtnInputs =\n        this.shipList_title.querySelectorAll('.titleBtn input')\n\n      // 为每个输入元素添加input事件监听器\n      titleBtnInputs.forEach((inputElement) => {\n        inputElement.addEventListener('input', (event: any) => {\n          const inputValue = event.target.value.toLowerCase().trim()\n          if (this.shipList_content) {\n            const contentTrs =\n              this.shipList_content.querySelectorAll('.contentContent tr')\n\n            // 首先给所有内容行添加'unvisiable'类\n            contentTrs.forEach((tr) => tr.classList.add('unvisiable'))\n\n            if (inputValue === '') {\n              // 如果输入为空，移除所有'unvisiable'类\n              contentTrs.forEach((tr) => tr.classList.remove('unvisiable'))\n            } else {\n              // 否则，根据输入值筛选并移除匹配项的'unvisiable'类\n              const matchingTrs = Array.from(contentTrs).filter((tr: any) =>\n                tr.getAttribute('el-data').includes(inputValue)\n              )\n              matchingTrs.forEach((matchingTr) =>\n                matchingTr.classList.remove('unvisiable')\n              )\n            }\n          }\n        })\n      })\n\n      // 船舶列表标题按钮清除点击事件\n      const clearButtons = this.shipList_title.querySelectorAll(\n        '.titleBtn div.clear'\n      )\n\n      // 为每个清除按钮添加点击事件监听器\n      clearButtons.forEach((button) => {\n        button.addEventListener('click', () => {\n          // 清空标题按钮中的输入值\n          if (this.shipList_title) {\n            const inputElement = this.shipList_title.querySelector(\n              '.titleBtn input'\n            ) as any\n            if (inputElement) {\n              inputElement.value = ''\n            }\n          }\n\n          // 移除所有'tr'元素的'unvisiable'类\n          if (this.shipList_content) {\n            const contentRows =\n              this.shipList_content.querySelectorAll('.contentContent tr')\n            contentRows.forEach((row) => row.classList.remove('unvisiable'))\n          }\n        })\n      })\n    }\n\n    // 辅助函数，检查元素是否有指定类\n    const hasClass = (element: Element, className: string) => {\n      return ` ${element.className} `.includes(` ${className} `)\n    }\n\n    // 辅助函数，为元素添加类\n    const addClass = (elements: Element[], className: string) => {\n      elements.forEach((element) => {\n        if (!hasClass(element, className)) {\n          element.className += ` ${className}`\n        }\n      })\n    }\n\n    // 辅助函数，为元素移除类\n    const removeClass = (elements: Element[], className: string) => {\n      elements.forEach((element) => {\n        element.className = element.className.replace(\n          new RegExp(`(^|\\\\b)${className.split(' ').join('|')}(\\\\b|$)`, 'gi'),\n          ' '\n        )\n      })\n    }\n\n    if (this.shipListDiv) {\n      // 船舶列表内容标题单元格点击事件\n      const titleSpans = this.shipListDiv.querySelectorAll(\n        '.playShipListContent .contentTitle td span'\n      )\n      titleSpans.forEach((span) => {\n        span.addEventListener('click', (event: any) => {\n          const target = event.currentTarget\n          if (target) {\n            const isVisible = hasClass(target, 'unvisiable')\n            const unvisiable = document.querySelectorAll(\n              '.playShipListContent td span.unvisiable'\n            )\n            removeClass(unvisiable as any, 'unvisiable')\n            this.playObjHMD = {}\n\n            if (!isVisible) {\n              addClass(\n                document.querySelectorAll(\n                  '.playShipListContent td span'\n                ) as any,\n                'unvisiable'\n              )\n              removeClass(target, 'unvisiable')\n              this.playObjHMD = { ...this.playObjHMD, ...this.playTrackItems }\n            }\n          }\n        })\n      })\n\n      // 船舶列表内容单元格点击事件\n      const contentSpans = this.shipListDiv.querySelectorAll(\n        '.playShipListContent .contentContent td span'\n      )\n      contentSpans.forEach((span) => {\n        span.addEventListener('click', (event) => {\n          event.stopPropagation()\n          const target = event.currentTarget as any\n          const trackId = target.closest('tr').getAttribute('el-trackID')\n          const isVisible = hasClass(target, 'unvisiable')\n          target.classList.toggle('unvisiable')\n          this.playObjHMD[trackId] = !isVisible\n        })\n      })\n\n      // 船舶列表内容行点击事件\n      const contentRows = this.shipListDiv.querySelectorAll(\n        '.playShipListContent .contentContent tr'\n      )\n      contentRows.forEach((row) => {\n        row.addEventListener('click', (event: any) => {\n          const shipName =\n            event.currentTarget.querySelector('.shipList_td3').textContent\n          if (this.options.shipListClickCallback) {\n            this.options.shipListClickCallback(shipName)\n          }\n        })\n      })\n\n      // 船舶列表底部导出按钮点击事件\n      const exportBtns = this.shipListDiv.querySelectorAll(\n        '.playShipListFoot input'\n      )\n      exportBtns.forEach((btn) => {\n        btn.addEventListener('click', () => {\n          const table = document.createElement('table')\n          const clonedTable = document\n            .querySelector(\n              '.playShipList:not(.truckplayer-display-none) .playShipListContent table'\n            )\n            ?.cloneNode(true)\n          clonedTable && table.appendChild(clonedTable)\n\n          console.log('TODO: 导出操作')\n          //  $(table).table2excel({\n          //    exclude: '.noExl',\n          //    name: 'Excel Document Name',\n          //    filename: `${$i18n.prop('ShipC_replayShipData', '回放船舶数据') + new Date().getTime()}.xls`,\n          //    fileext: '.xls',\n          //    exclude_img: true,\n          //    exclude_links: true,\n          //    exclude_inputs: true\n          //  })\n        })\n      })\n\n      // 船舶列表右键菜单阻止事件\n      this.shipListDiv.addEventListener('contextmenu', (event) => {\n        event.preventDefault()\n      })\n    }\n  }\n\n  _checkLoadDataStatus(): boolean {\n    return (\n      !this._hasLoadDone ||\n      CommUtils.msg(`数据尚未加载完成，请稍候...(${this._loadDataPercent}%)`)\n    )\n  }\n\n  setFullScreen(isFullScreen = false): void {\n    const _isFullScreen = isFullScreen !== false\n    this.setPlayerDisplay(_isFullScreen)\n  }\n\n  _setYuanPosition(event: MouseEvent): void {\n    if (\n      this.playTrackItems &&\n      Object.keys(this.playTrackItems).length > 0 &&\n      this.isMousedown\n    ) {\n      if (this.draggable._newPos == null) {\n        this.draggable._newPos = new L.Point(0, 0)\n      }\n      const offsetWidth = this.playerYuan.offsetWidth\n      const halfWidth = Math.round(offsetWidth / 2)\n      const mouseX = CommUtils.getMousePos(event).x\n      if (this.playerTiao) {\n        const elementPos = CommUtils.getElementPos(this.playerTiao)\n        const leftOffset =\n          mouseX - (elementPos.x + this.draggable._newPos.x) - halfWidth\n        const minLeft = Math.min(this.playerTiaoW + halfWidth, leftOffset)\n\n        this.playerYuan.style.marginLeft = `${Math.max(0, minLeft)}px`\n        this.playerJindu && (this.playerJindu.style.width = `${minLeft}px`)\n        this.playerPercentage =\n          Math.round(\n            10000 * Math.max(0, minLeft / (this.playerTiaoW + halfWidth))\n          ) / 10000\n\n        const timeDiff = this.maxTime - this.minTime\n        let timeOffset = Math.round(this.playerPercentage * timeDiff)\n        timeOffset =\n          Math.round(timeOffset / this.options.playFrequency) *\n          this.options.playFrequency\n        const newTime = this.minTime + timeOffset\n\n        this.playStart(newTime, false)\n        this.playStop()\n      }\n    }\n  }\n\n  _setPlayerPosition(): void {\n    const timeFromMin = Math.max(0, this.currentTimePosition - this.minTime)\n    this.playerMinValue = 0\n    this.playerMaxValue = Math.max(0, this.maxTime - this.minTime)\n    if (this.playerCtime) {\n      this.playerCtime.innerHTML = CanvasShipUtils.dataFormat(\n        new Date(this.currentTimePosition),\n        'YYYY-MM-DD HH:mm:ss'\n      )\n    }\n\n    if (this.currentTimePosition === this.maxTime && this.playBtn) {\n      L.DomUtil.removeClass(this.playBtn, 'start')\n      L.DomUtil.removeClass(this.playBtn, 'stop')\n      L.DomUtil.addClass(this.playBtn, 'start')\n    }\n    this.playerPercentage =\n      Math.round((timeFromMin / this.playerMaxValue) * 10000) / 10000\n    const fullWidth = this.playerYuan.offsetWidth\n    const sliderWidth = this.playerTiaoW + Math.round(fullWidth / 2)\n    this.playerPercentage = Math.max(0, this.playerPercentage)\n    this.playerPercentage = Math.min(1, this.playerPercentage)\n    const sliderPos = this.playerPercentage * sliderWidth\n    this.playerYuan.style.marginLeft = `${sliderPos}px`\n    this.playerJindu && (this.playerJindu.style.width = `${sliderPos}px`)\n  }\n\n  closeTrackPlay(): void {\n    if (this._map.trackService && this.options.onCloseRemoveAllTrack) {\n      this._map.trackService.removeAll()\n    }\n    this.removeTracks()\n    this._removeShipHistoryTrack()\n    this.currentTimePosition = 0\n    if (this.options.closeCallback) {\n      this.options.closeCallback()\n    }\n  }\n\n  // 检测引入脚本\n  // _checkDependence(): boolean {\n  //   return LoadDependenceUtil.loadByType('table2excel')\n  // }\n}\n\nconst trackPlayServiceImpl = (\n  map: any,\n  options?: Partial<TrackPlayServiceOptions>\n) => {\n  return new TrackPlayServiceImpl(map, options)\n}\n\nexport { TrackPlayServiceImpl, trackPlayServiceImpl }\n// 使用示例\n// const myMap = {} // 假设这是你的地图实例\n// const trackService = new TrackPlayServiceImpl(myMap, {\n//   playSpeed: 2,\n//   beginTime: 10\n// })\n"],"names":["v","n","Symbol","ArrowHead","extend","hdg","_buildArrowPath","u","t","e","i","project","latLng","s","this","options","ship","l","d","getShipTemplater","shipTemplaterThree","sizeZoomShipTemplater","shipTemplaterZoom","a","x","y","o","centerXY","r","h","heading","p","area","length","c","m","pointRotate","push","unproject","Point","L","Object","assign","k","constructor","playSpeed","playFrequency","beginTime","showPlayObjLable","playObjPlayerItems","playObjLabelItems","name","headXY","headXY2","isPlayerDraggable","isVisiableWithNoSignal","isVisiableOutOfBounds","isVisiableShipTrack","shipTrackMaxInterval","onCloseRemoveAllTrack","_playObjLabelTemplater","mmsi","sog","cog","isMousedown","playSpeedSelectlis","playerTiaoW","trackInfoViewCount","trackInfoCIndex","playState","requestingData","currentTimePosition","playSpeedList","playSpeedOne","minTime","maxTime","playTrackItems","playObjBMD","playObjHMD","maxSupplementPointInterval","step","curStep","shipHistoryTrackStyle","renderer","canvas","color","fillColor","weight","shipHistoryTrackData","shipHistoryTrackLine","_map","_hasLoadDone","_loadDataPercent","budian_timers","setPlaySpeed","_createPlayerHtml","addPlayTrack","trackService","get","addPlayTrackByItem","items","isEnablePlayer","symbol","trackId","isAdd","requesting","isBMD","removeTracks","latlngsFrom180","data","_supplementLatLng","trackid","_resetMinMaxTime","startTime","endTime","setPlayerDisplay","_playTrackInfoCarousel","playStart","playStop","setDataLoadDone","f","msg","clearPlayObjBMD","clearPlyObjHMD","keys","removePlayObjByItem","document","querySelector","remove","playObj","removeLayer","playObjLabel","Math","max","min","_playByPosition","playBtn","DomUtil","removeClass","addClass","playStartOrStop","indexOf","playSpeedSelectUL","querySelectorAll","forEach","classList","add","playSpeedText","setAttribute","innerHTML","setPlaySpeedList","Number","create","playerOptionDiv","addEventListener","currentTarget","getAttribute","style","display","getPlaySpeed","playerDiv","playerTiao","offsetWidth","playerYuan","includes","trackInfo_leftBtn","trackInfo_rightBtn","shipListBtn","_creatPlayObj","width","fillOpacity","stroke","fill","lineColor","polylineDecorator","patterns","offset","pixelSize","headAngle","pathOptions","zIndexOffset","_creatOrUpdatePlayObjLable","dataInfo","toLowerCase","custom_name","cnname","shipName","MMSI","Mmsi","replace","setLatLng","_tooltip","_container","icon","iconUrl","iconAnchor","iconSize","marker","bindTooltip","direction","opacity","permanent","className","openTooltip","off","addTo","setPlayObjLabelShow","Array","from","filter","parentElement","contains","setShipWithNoSignalShow","setPlayObjLabelContent","utc","lon","lng","lat","_getNearGPSTracks","_dongtaibudian","_removeShipHistoryTrack","_getPreviousGPSTimeByCTime","GPSEncryptByMapToLatLng","_setItem_HDG","setPaths","_updateTrackInfo","playGPSCallBack","setTimeout","_drawShipHistoryTrack","_setPlayerPosition","playCallBack","_getCurrentTimeShipInfo","_getCurrentTimeShipHistoryTrack","setShipHistoryTrackShow","playSate","setShipHistoryTrackStyle","setStyle","setLatLngs","polyline","playerCtime","playerEtime","dataFormat","Date","DomEvent","disableClickPropagation","disableScrollPropagation","playerTitleDiv","playerTitleOption","_getPlayOptionHtml","playerTitleBtn","playerJindu","playerTimeDiv","title","playSpeedDiv","playSpeedImg","toString","shipListBtnText","trackInfoSHBtn","trackInfoDiv","trackInfo_center","shipListDiv","shipList_title","shipList_content","shipList_foot","Draggable","enable","_getShipListHtml","playerPercentage","playerMinValue","playerMaxValue","_buildPlayer","draggable","_enabled","disable","textContent","shipname","shipid","getShipTypeCN","type","_updateShipList","round","abs","_addTrackInfo","trackInfoCenter","_createTrackHtml","id","_patterns","symbolFactory","latFormatter","navistatus","getDisValue","body","onclick","onmousedown","_checkLoadDataStatus","onmousemove","_setYuanPosition","onmouseleave","onmouseup","checked","target","nodeName","T","parentNode","b","map","labelOptionCallback","playerTitleFullScreen","setFullScreen","fullScreenCallback","closeTrackPlay","getElementPos","left","top","value","trim","RegExp","split","join","stopPropagation","closest","toggle","shipListClickCallback","createElement","cloneNode","appendChild","preventDefault","_newPos","getMousePos","marginLeft","removeAll","closeCallback","S"],"mappings":"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"}