{"version":3,"file":"CanvasShipService.mjs","sources":["../../../../packages/sdk/CanvasShipService.ts"],"sourcesContent":["import L from 'leaflet'\nimport {\n  cloneDeep,\n  hasIn,\n  isEmpty,\n  isNull,\n  merge,\n  throttle,\n} from 'lodash-unified'\nimport { ShipxyOptions } from '@map-sdk/sdk/config'\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 { canvasShipSymbol } from '@map-sdk/sdk/CanvasShipSymbol'\nimport AreaShipsDataGridSymbol from '@map-sdk/sdk/utils/AreaShipsDataGridSymbol'\nimport { CanvasShip } from '@map-sdk/sdk/model/CanvasShip'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\nimport type { CustomMap } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport type { Layer } from 'leaflet'\n\ninterface Ship {\n  // 自定义船舶名称，用于区别显示或其他个性化用途\n  custom_name: string\n  // 船舶所属分组或集群的名称\n  group_name: string\n  // 关于船舶的额外备注或说明信息\n  remark?: string\n  // 数据来源编号，指明船舶数据的提供源头\n  source: number\n  // 实际数据来源编号，更为具体的来源标识\n  source_real: number\n  // MMSI号码，船舶独一无二的九位数字识别码\n  mmsi: string\n  // 船舶在系统内的唯一标识ID\n  shipid: string\n  // 船舶通信终端ID，默认未定义\n  terminalid: undefined\n  // 船舶通信终端类型，默认未定义\n  terminaltype: undefined\n  // 船舶当前地理位置的经度\n  lng: number\n  // 船舶当前地理位置的纬度\n  lat: number\n  // 船首向（Heading），表示船舶艏部指向的角度（单位通常为度）\n  hdg: number | undefined\n  // 船首向数据来源，默认未定义\n  hdg_source: undefined\n  // 方向角（Course Over Ground, COG），船舶实际行驶方向相对于地球表面的角度\n  cog: number | undefined\n  // 地面速度（Speed Over Ground, SOG），船舶在地面上的实际运动速度\n  sog: number | undefined\n  // 航向改变率，即船舶航向变化的速度\n  rot: number | undefined\n  // 船舶导航状态代码，表示船舶当前导航系统的运行状态\n  navistatus: string\n  // 最后一次动态更新的时间戳，记录船舶状态最后更新的时间\n  lastdyn: number\n  // 标记最后一次动态更新是否有效\n  lastdyn_active: boolean\n  // 船舶类型代码，标识船舶类别\n  type: number | string\n  // 船舶的官方名称\n  name: string\n  // 船舶的中文名称，默认未定义\n  cnname: undefined\n  // 船舶的英文名称，默认未定义\n  nameen: undefined\n  // 船舶呼号，默认未定义\n  callsign: undefined\n  // 国际海事组织编号（IMO号），船舶的国际唯一身份识别码\n  imo: string\n  // 船舶长度\n  length: number\n  // 船舶宽度\n  width: number\n  left: number //\n  // 船迹长度，记录船舶航行轨迹的总长度\n  trail: number\n  // 吃水深度，船舶底部到水面的距离\n  draught: number\n  // 目的地，默认未定义\n  dest: undefined\n  // 预计到达时间，默认未定义\n  eta: undefined\n  // 船舶最后一次定位的时间戳，默认未定义\n  laststa: undefined\n  // 船舶的历史轨迹记录，目前未定义任何类型\n  tracks: never[]\n  // 标识船舶当前是否处于停止状态\n  istop: boolean\n  // 船舶在地图或其他界面中的颜色标识\n  color: string\n  // 船舶状态代码，用于区分不同运营状态\n  // 0 表示对象处于某种非活动状态或初始化状态。延迟<30分钟\n  // 1 表示对象处于中间状态，可能是警告状态或需要用户注意的状态 30分钟<延迟<2个小时\n  // 2 表示对象处于完全活动状态或正常工作状态 延迟> 2小时\n  state: number\n  // 真实地理坐标系下的船舶中心点坐标，默认未定义\n  pointCenterReal: undefined\n  // GPS坐标系下的船舶中心点坐标，默认未定义\n  pointCenterGPS: undefined\n  // 真实地理坐标系下的船舶经纬度坐标，默认未定义\n  latlngReal: undefined\n  // GPS坐标系下的船舶经纬度坐标，默认未定义\n  latlng: undefined\n  // 可能在二维平面上表示的船舶横坐标\n  x: number\n  // 可能在二维平面上表示的船舶纵坐标\n  y: number\n  // 船舶在地图上绘制时的线宽\n  lineWidth: number\n  // 船舶图标旋转角度\n  rotate: number\n  // 船体区域信息，默认未定义\n  bodyArea: undefined\n  // 船舶头部在某个坐标系下的横坐标，默认未定义\n  head_x: undefined\n  // 船舶头部在某个坐标系下的纵坐标，默认未定义\n  head_y: undefined\n  // 船舶类型的另一种表示方式\n  shiptype: number | string\n  // 数据功率或者数据强度，可能与船舶信号传输有关\n  datapower: number\n  // 是否为某种特定类型（yh的具体含义未给出）\n  is_yh: boolean\n  // 标识船舶是否处于监控状态\n  is_monitor: boolean\n  // 标识船舶监控状态是否在线\n  monitorOnline: boolean\n  // 标识船舶是否在中国境外\n  outCN: boolean\n  // 偏移量，可能用于计算船舶位置或其他属性的偏移\n  offset: number\n  // 船旗国编号\n  country: number\n  // 文本颜色，可能用于标注船舶信息的颜色\n  txt_color: string\n  // 新类型标识，可能用于区分不同分类或状态\n  newtype: string\n  // 船舶线条颜色，默认未定义\n  lineColor: undefined\n  // 船舶高度线颜色，默认未定义\n  heightLineColor: undefined\n  // 附加选项或配置信息，默认未定义\n  options: undefined\n\n  // 所属海域ID，标识船舶所在的海洋区域\n  seaareaid: string\n\n  // 是否显示时间标签，默认未定义\n  isShowLableTime: undefined\n\n  // 是否显示船舶标签，默认未定义\n  isShowLabel: undefined\n\n  // 船舶标签文本，默认未定义\n  labelText: undefined\n\n  // 标识船舶是否出现在雷达监测范围内\n  is_radar: boolean\n\n  // 雷达设备ID，默认未定义\n  radarid: undefined\n\n  // 雷达数据来源，默认未定义\n  radarSource: undefined\n\n  // 雷达目标信息，默认未定义\n  radarTarget: undefined\n\n  // GPS提供的船舶最新经纬度信息中的纬度\n  gps_lat: number\n\n  // GPS提供的船舶最新经纬度信息中的经度\n  gps_lng: number\n\n  // GPS最后一次更新\n  gps_lastdyn: string\n  // 服务器时间\n  serverTime: undefined\n  shipxy_tooltip?: L.Tooltip\n  //表示船舶在某个数组或其他集合中的位置索引\n  arr_inde: number\n  //该船舶是否被用户选择或标记。如果为 true，则表示当前船舶在用户界面操作中已被选中；若为 false，则未被选中。\n  isSelected: boolean\n}\n\n// 假设以下是一些相关的数据类型定义\n\ninterface SpecialShip extends Ship {\n  color: string\n  istop: boolean\n}\n\ninterface LabelData {\n  symbol: any\n  calcLabel: any // 需要具体的类型定义\n  sourceType: any\n  labelImage: any // 需要具体的类型定义\n  labelText: string\n  txtColor: string\n  font: string\n  lineColor: string\n  lineFillColor: string | null\n  obliqueLineColor: string | null\n  lableRotate: any // 需要具体的类型定义\n}\nexport interface CanvasShipServiceOptions {\n  isAutoUpdateSrvtime?: boolean // 是否自动更新srvtime，默认：true\n  enableAreaShip?: boolean // 是否自动刷新区域船，默认：true\n  enableFleetShip?: boolean // 是否自动刷新关注船，默认：true\n  enableDShip?: boolean // 是否自动刷新D+船，默认：false\n  enableTracks?: boolean // 是否显示近期轨迹，默认：true\n  enableSelectedShip?: boolean // 是否自动刷新选中船，默认：false\n  dShipColor?: string // D+船颜色，默认：\"#ff6347\"\n  topLabelZoom?: number // 顶层船从第几级开始显示标签，默认：1\n  generalLabelZoom?: number // 普通船从第几级开始显示标签，默认：13\n  weixingLabelZoom?: number // 卫星船从第几级开始显示标签，默认：1\n  delayTime?: number // 刷新间隔时间，单位：毫秒\n  bounds?: L.LatLngBoundsExpression // 指定区域船显示的区域，默认是地图可视范围\n  zoomLevel_base?: number // 默认值：9，zoom大于该值，用于船舶分组：baseShips\n  lableRotate?: number | undefined // 标签旋转角度，默认值：undefined\n  lableTxtColorMapTypeDark?: string[] // 船舶名称文字颜色（针对深色瓦片类型），默认：[\"MT_SATELLITE\", \"MT_ESRI\", \"MT_WEIRUANWEIXING\"]\n  lableTxtColor?: string[] // 船舶名称文字颜色，默认值：[\"#000\",\"#fff\"]\n  lableFont?: string[] // 船舶名称文字字体，默认值：[\"'600 12px Arial'\", \"'500 12px Arial'\"]\n  lableLineColor?: string[] // 船舶名称文字线框颜色，默认值：[\"#000\",\"#000\"]\n  monitorShips?: number[] // 安装有视频监控的船舶MMSI列表\n  getAreaShipsCallBack?: (ships: CanvasShip[]) => void // 区域船外部数据回调，返回CanvasShip对象数组，默认值：undefined\n  drawShipsEndCallBack?: (shipCount: Record<string, any>) => void // 绘制区域船后回调，返回对象：{count:number}\n  shipSizeZoom?: number // 船舶缩放比例，默认值：1\n  shipOptions?: any // 船舶模型设置（假设为复杂对象结构，这里未给出具体类型）\n  tooltip_fields?: any // tooltip 显示字段设置（假设为复杂对象结构，这里未给出具体类型）\n  drawBaseShipsGridZoom?: number[] // 级别，0.1°网格显示船舶数量限制级别，默认：[]\n  drawBaseShipsGridMax?: number[] // 数量，0.1°网格显示船舶数量限制数量，默认：[]，大于0生效\n  drawBaseShipsGridSize?: number[] // 缩放级别对应的网格大小，默认：[]，默认：0.5\n  drawBaseShipsGridMaxCount?: number // 绘制船大于该数量，开启网格抽稀绘制，默认：0，大于0生效\n  areaShipsDataGridSize?: number // 网格化存储，网格大小，默认：0.05\n  // 开启右键菜单配置项\n  openRightMenu?: {\n    selectShip: boolean // 右键的时候是否选中船舶\n    isUse: boolean // 是否开启右键菜单\n  }\n}\n\nexport interface CanvasShipMap extends CustomMap {\n  _hoverShipId: any\n  offsetC: any\n  _selShipId: Record<string, any>\n  _size: L.Point\n  _unselectedShipListener?: (params?: any) => void\n  shipsService?: CanvasShipService\n}\n\nclass CanvasShipService extends L.Class {\n  _filterOptions: {\n    shipType: string\n    shipSog: string\n    shipCustomSog: never[]\n    shipNaviStatus: string\n    shipLength: number[][]\n    shipHdg: number[][]\n    shipCountry: string\n    validIMO: boolean\n  }\n  options: {\n    isAutoUpdateSrvtime: boolean\n    enableAreaShip: boolean\n    enableFleetShip: boolean\n    enableTracks: boolean\n    enableDShip: boolean\n    enableSelectedShip: boolean\n    requestCallback: {\n      getShip: null\n      getAreaShip: null\n      getDPlusShip: null\n      getFleetShip: null\n    }\n    dShipColor: string\n    topLabelZoom: number\n    generalLabelZoom: number\n    weixingLabelZoom: number\n    delayTime: number\n    offsetLastdyn: number\n    bounds: undefined\n    getAreaShipsCallBack: undefined\n    zoomLevel_base: number\n    labelLanguage: string\n    lableRotate: Record<string, any>\n    lableFont: Record<string, any>\n    lableTxtColorMapTypeDark: string[]\n    lableTxtColor: Record<string, any>\n    lableLineColor: Record<string, any>\n    lableLinefillColor: Record<string, any>\n    monitorShips: string[]\n    obliqueLineColor: Record<string, any>\n    resetShipColorCallBack?: (params: any) => void\n    drawShipsEndCallBack?: (params: any) => void\n    drawShipsBeforeCallBack?: (params: any) => any\n    drawRequestShipsBeforeCallback?: (params: any) => any\n    shipSizeZoom: number\n    shipOptions: {\n      sizeZoom: number\n      lineColor: string\n      heightLineColor: string\n    }\n    tooltip_fields: string[]\n    areaShipsDataGridSize: number\n    drawBaseShipsGridZoom: number[]\n    drawBaseShipsGridMax: never[]\n    drawBaseShipsGridSize: never[]\n    drawBaseShipsGridMaxCount: number\n    isShowLableTime: undefined\n    isShowLabel: boolean\n    radarOptions: {\n      color: string\n      lineColor: string\n      heightLineColor: string\n      lineWidth: number\n      iconSize: number\n    }\n    openRightMenu?: {\n      selectShip: boolean\n      isUse: boolean\n    }\n    netsondeOptions: {\n      show: boolean\n      color: string\n      lineColor: string\n      heightLineColor: string\n      lineWidth: number\n      iconSize: number\n    }\n    color: string\n    maptype: string\n    labelImages: Record<string, any>\n  }\n  _mouseMoveTimer: any | undefined\n  _timerOpen: boolean\n  _timer!: any | null\n  _map_move_time_num: number\n  _canvas_mousedown: boolean\n  _moveendTimer: null\n  _labelImages: {\n    common?: boolean\n    satellite?: boolean\n    dplus?: boolean\n    beidou?: boolean\n    monitor?: boolean\n  }\n  _map: MyMap\n  _srvTime: number\n  _layerGroup: L.FeatureGroup<any>\n  _zoomLevel: any\n  _areaShipIsShow: boolean\n  _noSelShipIsShow: boolean\n  _grid_ships: any\n  _requestAreaShips: CanvasShip[]\n  _requestAreaShipsLoading: boolean\n  _requestAreaShips_timer: undefined\n  _requestAreaShips_num: number\n  _selectedShipUpdateListener?: ((params: any) => void) | null\n  _selectedShipListener?: ((params: any) => void) | null\n  _rightContentMenu?:\n    | ((ship: Ship | null, style?: Record<string, any>) => void)\n    | null\n  _isRightContentMenuOpen = false // 标识是否已经弹出右键菜单\n  _fleetShips: Record<string, CanvasShip> //FleetShip是船队船舶数据结构\n  _DShips: Record<string, CanvasShip> // DSship是特定类型船舶数据结构\n  _specialShips: Record<string, SpecialShip> // SpecialShip是特殊船舶数据结构\n  _DShips_key: string\n  _beidou_ships: string[]\n  _viewShips: CanvasShip[]\n  _labels: LabelData[]\n  _labels_time: number\n  _drawLables!: LabelData[]\n  _scode: number\n  _continue: number\n  _monitorShipsHash: Record<string, any>\n  _drawCount: number\n  _topShipsCount: number\n  _baseShipsCount: number\n  _baseShipsCount_chouxi: number\n  _clrState: string[]\n  _timer_area_num: number\n  _delayTime: number\n  _grid_ships_view_filter!: Map<string, any>\n  _tooltip_txt_templater: {\n    name: string\n    cnname: string\n    mmsi: string\n    imo: string\n    callsign: string\n    sog: string\n    cog: string\n    hdg: string\n    draught: string\n    dest: string\n    lastdyn: string\n    navistatus: string\n    type: string\n    rot: string\n    lat: string\n    lng: string\n    seaareaid: string\n  }\n  _tooltip!: Layer | null\n\n  constructor(map: MyMap, options?: CanvasShipServiceOptions) {\n    super()\n\n    // 设置过滤船舶信息\n    this._filterOptions = {\n      shipType: '',\n      shipSog: '0,1',\n      shipCustomSog: [],\n      shipNaviStatus: '',\n      shipLength: [\n        [0, 40],\n        [41, 80],\n        [81, 160],\n        [161, 240],\n        [241, 320],\n        [321, 9999],\n      ],\n      shipHdg: [\n        [0, 360],\n        [511, 511],\n      ],\n      shipCountry: '0,1,2',\n      validIMO: false,\n    }\n    this.options = {\n      isAutoUpdateSrvtime: true,\n      enableAreaShip: true,\n      enableFleetShip: true,\n      enableTracks: false,\n      enableDShip: false,\n      enableSelectedShip: false,\n      requestCallback: {\n        getShip: null,\n        getAreaShip: null,\n        getDPlusShip: null,\n        getFleetShip: null,\n      },\n      dShipColor: '#ff6347',\n      topLabelZoom: 1,\n      generalLabelZoom: 13, // 自动显示标牌层级\n      weixingLabelZoom: 1,\n      delayTime: 15000,\n      offsetLastdyn: 0,\n      bounds: undefined,\n      getAreaShipsCallBack: undefined,\n      zoomLevel_base: 2, // 控制在第几级显示\n      labelLanguage: ShipxyOptions.language.language,\n      lableFont: ['600 12px Arial', '500 12px Arial'],\n      lableTxtColorMapTypeDark: [\n        'MT_SATELLITE',\n        'MT_ESRI',\n        'MT_WEIRUANWEIXING',\n      ],\n      lableRotate: [4, 4],\n      lableTxtColor: ['#fff', '#000'],\n      lableLineColor: ['#000', '#000'],\n      lableLinefillColor: [\n        'rgba(255, 255, 255, 0.8)',\n        'rgba(255, 255, 255, 0.8)',\n      ],\n      monitorShips: [],\n      obliqueLineColor: ['#000', '#000'],\n      shipSizeZoom: 1,\n      shipOptions: {\n        sizeZoom: 1,\n        lineColor: '#000',\n        heightLineColor: '#000',\n      },\n      tooltip_fields: ['name', 'callsign', 'imo', 'mmsi', 'lastdyn'],\n      areaShipsDataGridSize: 0.05,\n      drawBaseShipsGridZoom: [],\n      drawBaseShipsGridMax: [],\n      drawBaseShipsGridSize: [],\n      drawBaseShipsGridMaxCount: 0,\n      isShowLableTime: undefined,\n      isShowLabel: true,\n      radarOptions: {\n        color: '#ffa500',\n        lineColor: '#000000',\n        heightLineColor: '#000000',\n        lineWidth: 1,\n        iconSize: 6,\n      },\n      openRightMenu: {\n        isUse: true,\n        selectShip: true,\n      },\n      netsondeOptions: {\n        show: true,\n        color: 'rgba(255,255,0,0.2)',\n        lineColor: 'rgba(255,255,0,1)',\n        heightLineColor: 'rgba(255,255,0,1)',\n        lineWidth: 1,\n        iconSize: 14,\n      },\n      color: '',\n      maptype: '',\n      labelImages: {},\n    }\n    this._timerOpen = false\n    this._map_move_time_num = 0\n    this._canvas_mousedown = false\n    this._moveendTimer = null\n    this._labelImages = {}\n    this._map = map\n    this._map._selShipId = {}\n    this._srvTime = Date.now() / 1000\n    L.Util.extend(this.options, options)\n    this._layerGroup = L.featureGroup().addTo(map)\n    this._zoomLevel = this._map.getZoom()\n    this._areaShipIsShow = true\n    this._noSelShipIsShow = true\n    this._grid_ships = AreaShipsDataGridSymbol(this._map, {\n      grid_size: this.options.areaShipsDataGridSize,\n    })\n    this._requestAreaShips = []\n    this._requestAreaShipsLoading = false\n    this._requestAreaShips_timer = undefined\n    this._requestAreaShips_num = 0\n    this._fleetShips = {}\n    this._DShips = {}\n    // 特殊船舶\n    this._specialShips = {}\n    this._DShips_key = 'd_'\n    // 北斗船舶\n    this._beidou_ships = []\n    this._viewShips = []\n    this._labels = []\n    this._labels_time = 0\n    this._scode = 0\n    this._continue = 0\n    this._monitorShipsHash = {}\n    this._tooltip_txt_templater = {\n      name: '船名：{1}<br/>',\n      cnname: '中文船名：{1}<br/>',\n      mmsi: 'MMSI：{1}<br/>',\n      imo: 'IMO：{1}<br/>',\n      callsign: '呼号：{1}<br/>',\n      sog: '航速：{1}节<br/>',\n      cog: '航迹向：{1}度<br/>',\n      hdg: '船首向：{1}度<br/>',\n      draught: '吃水：{1}米<br/>',\n      dest: '目的地：{1}<br/>',\n      lastdyn: '时间：{1}<br/>',\n      navistatus: '状态：{1}<br/>',\n      type: '类型：{1}<br/>',\n      rot: '旋转角速度：{1}度/秒<br/>',\n      lat: '纬度：{1}<br/>',\n      lng: '经度：{1}<br/>',\n      seaareaid: '海区：{1}<br/>',\n    }\n\n    this._drawCount = 0\n    this._topShipsCount = 0\n    this._baseShipsCount = 0\n    this._baseShipsCount_chouxi = 0\n    this._clrState = ['#ffff66', '#00cc00', '#999999']\n    this._timer_area_num = 1\n    this.resizeHTML()\n    this._labelImages = this._getLabelImages()\n    this._map.on(\n      'move',\n      throttle((e) => {\n        this._map_move_function()\n        this._drawShips(e)\n      }, 100)\n    )\n    this._map.on(\n      'moveend',\n      throttle((e) => {\n        this._zoomLevel = this._map.getZoom()\n        this._map_move_end_function(e)\n      }, 100)\n    )\n    this._map.on('baselayerchange', (shipData) => {\n      this._drawShips(shipData)\n    })\n    this._delayTime = Math.max(5000, this.options.delayTime)\n    if (\n      this.options.enableAreaShip ||\n      this.options.enableFleetShip ||\n      this.options.enableSelectedShip\n    )\n      this._timerStart()\n  }\n\n  resizeHTML() {\n    this._drawCount = 0\n    this._topShipsCount = 0\n    this._baseShipsCount = 0\n    this._baseShipsCount_chouxi = 0\n    const { clientWidth, clientHeight } = this._map.getContainer()\n    this._map._size = new L.Point(clientWidth || 0, clientHeight || 0)\n    const panes = this._map.getPanes()\n    panes.divCanvasShipsPane && panes.divCanvasShipsPane.remove()\n    const divCanvasShips = L.DomUtil.create(\n      'div',\n      'div-canvas-ships',\n      panes.overlayPane\n    )\n    divCanvasShips.style.zIndex = '150'\n    panes.divCanvasShipsPane = divCanvasShips\n    const canvasShips = L.DomUtil.create(\n      'canvas',\n      'canvas-ships',\n      panes.divCanvasShipsPane\n    )\n    canvasShips.width = this._map.getSize().x\n    canvasShips.height = this._map.getSize().y\n    canvasShips.addEventListener(\n      'mousedown',\n      () => {\n        this._canvas_mousedown = true\n      },\n      false\n    )\n\n    canvasShips.addEventListener(\n      'mouseup',\n      () => {\n        this._canvas_mousedown = false\n      },\n      false\n    )\n\n    canvasShips.addEventListener(\n      'mousemove',\n      (e) => {\n        this._drawCount\n          ? this._drawCount > 0 &&\n            !this._canvas_mousedown &&\n            this._mousemoveFunction(e, this)\n          : this._closeTooltip()\n      },\n      false\n    )\n    if (this.options.openRightMenu?.isUse) {\n      // 在容器上添加右键点击事件监听\n      canvasShips.addEventListener(\n        'contextmenu',\n        (event: any) => {\n          event.preventDefault() // 阻止默认的右键菜单\n          const ship: Ship = this.getShipByEvent(event)\n          if (!ship) return\n          // 当开启右键定位船舶的时候 绘制\n          if (this.options.openRightMenu?.selectShip)\n            this.setSelectedShip(ship.shipid)\n          // 在这里可以添加自定义的上下文菜单代码\n\n          const positionPopup = (\n            event: { layerX: number; layerY: any },\n            popup: HTMLElement\n          ) => {\n            // 首先，确保弹出层是可见的以测量其尺寸\n            popup.style.display = 'block'\n\n            // 获取弹出层的尺寸\n            const popupWidth = popup.offsetWidth\n            const popupHeight = popup.offsetHeight\n\n            // 计算弹出层的初始位置\n            let left = event.layerX + 10\n            let top = event.layerY\n\n            // 获取屏幕的尺寸\n            const { x: windowWidth, y: windowHeight } = this._map.getSize()\n\n            // 调整位置以防止弹出层超出屏幕右侧或底部\n            if (event.layerX + popupWidth > windowWidth) {\n              left = windowWidth - popupWidth - 100\n            }\n            if (event.layerY + popupHeight > windowHeight) {\n              top = windowHeight - popupHeight - 30\n            }\n\n            return { left, top }\n          }\n          const { left, top } = positionPopup(\n            event,\n            document.querySelector('.context-menu') as HTMLElement\n          )\n          ship &&\n            this._rightContentMenu &&\n            this.disableMap() &&\n            this._rightContentMenu(ship, {\n              left: `${left}px`,\n              top: `${top}px`,\n              display: 'block',\n            })\n          this._isRightContentMenuOpen = true\n        },\n        false\n      )\n    }\n\n    canvasShips.addEventListener('click', (e) => {\n      this.closeRightMenu()\n      if (this._drawCount) {\n        const mouseInArr = CanvasShipUtils.mouseInArr(\n          this._map.getPanes().canvasShipsPane,\n          e,\n          this._viewShips\n        )\n        mouseInArr\n          ? this.setSelectedShip(mouseInArr.shipid)\n          : this._map._unselectedShipListener &&\n            setTimeout(() => {\n              this._map._unselectedShipListener &&\n                this._map._unselectedShipListener()\n            }, 50)\n      }\n    })\n\n    this._map.getPanes().canvasShipsPane = canvasShips\n    this._drawShips()\n  }\n  closeRightMenu() {\n    if (this._isRightContentMenuOpen) {\n      this._rightContentMenu &&\n        this.enableMap() &&\n        this._rightContentMenu(null, { display: 'none' })\n      if (this.options.openRightMenu?.isUse) this.cancelSelectedShip()\n      this._isRightContentMenuOpen = false\n    }\n  }\n  disableMap() {\n    this._map.dragging.disable()\n    this._map.touchZoom.disable()\n    this._map.scrollWheelZoom.disable()\n    return true\n  }\n  enableMap() {\n    this._map.dragging.enable()\n    this._map.touchZoom.enable()\n    this._map.scrollWheelZoom.enable()\n    return true\n  }\n  _getLabelImages() {\n    return {\n      common: false,\n      satellite: true,\n      dplus: true,\n      monitor: true,\n      beidou: false,\n    }\n  }\n  _map_move_end_function(e?: L.LeafletEvent) {\n    console.log(`_map_move_end_function time(start):${Date.now()}`)\n    const startTime = Date.now()\n    this._map_move_time_num = Date.now()\n    this._map_move_function()\n    this._drawShips(e)\n\n    if (this.options.enableAreaShip) {\n      Promise.all([\n        this._requestAreaShips_v3(),\n        this._requestAreaShips?.length > 0 && this._drawRequestShips(this),\n      ]).then(() => {\n        if (typeof window.requestIdleCallback === 'function') {\n          window.requestIdleCallback(() => {\n            this._drawRequestShips(this)\n          })\n        } else {\n          setTimeout(() => {\n            this._drawRequestShips(this)\n          }, 800)\n        }\n      })\n    }\n\n    console.log(`_map_move_end_function time(end):${Date.now() - startTime}`)\n  }\n\n  private getMapTransform(map: any): string {\n    const style = map._mapPane.getAttribute('style')\n    let transformCss = ''\n    const translateKey = L.Browser.ie ? 'translate' : 'translate3d'\n    const translateIndex = style.indexOf(`transform: ${translateKey}(`)\n\n    if (translateIndex !== -1) {\n      const endOfTransform = style.indexOf(')', translateIndex)\n      const translateValue = style\n        .substring(\n          translateIndex + `transform: ${translateKey}(`.length,\n          endOfTransform\n        )\n        .split(',')\n      const [x, y] = translateValue.map(\n        (val: string) => Number.parseInt(val, 10) * -1\n      )\n\n      transformCss = `${translateKey}(${x}px,${y}px`\n      if (!L.Browser.ie) {\n        transformCss += `,${translateValue[2]}`\n      }\n      transformCss += ')'\n    }\n\n    return transformCss\n  }\n  private _map_move_function() {\n    const map = this._map as unknown as any\n\n    // 获取canvasShipsPane和divCanvasShipsPane元素，并确保它们已初始化\n    const canvasShipsPane = map.getPane('canvasShipsPane') as\n      | HTMLElement\n      | undefined\n    const divCanvasShipsPane = map.getPane('divCanvasShipsPane') as\n      | HTMLElement\n      | undefined\n\n    if (!canvasShipsPane || !divCanvasShipsPane) {\n      console.error(\n        'Missing required map panes: canvasShipsPane and/or divCanvasShipsPane'\n      )\n      return\n    }\n\n    // 获取当前地图视口尺寸\n    const { x: width, y: height } = map.getSize()\n\n    // 设置canvasShipsPane的尺寸\n    canvasShipsPane.style.width = `${width}px`\n    canvasShipsPane.style.height = `${height}px`\n\n    // 计算并应用初始transform值\n    const initialTransformValue = this.getMapTransform(map)\n    divCanvasShipsPane.style.transform = initialTransformValue\n\n    // 移动端优化：尝试解决可能出现的渲染偏差\n    // 1. 强制触发重排和重绘（在某些情况下可能有助于修正偏差）\n    // 假设在应用初始transform之前保存了元素的初始位置\n    const initialRect = divCanvasShipsPane.getBoundingClientRect()\n\n    // divCanvasShipsPane.getBoundingClientRect()\n    // 2. 使用requestAnimationFrame在下一帧渲染时检查并调整transform值\n    requestAnimationFrame(() => {\n      // 检查应用初始transform值后是否存在位移\n      const rectAfterInitialTransform =\n        divCanvasShipsPane.getBoundingClientRect()\n      const displacement = {\n        x: rectAfterInitialTransform.x - initialRect.x,\n        y: rectAfterInitialTransform.y - initialRect.y,\n      }\n\n      if (displacement.x !== 0 || displacement.y !== 0) {\n        // 调整transform值以补偿位移\n        const adjustedTransform = `${initialTransformValue} translate(${-displacement.x}px, ${-displacement.y}px)`\n        divCanvasShipsPane.style.transform = adjustedTransform\n      }\n    })\n    // TODO: 新增方式 2024-07-03\n    let hasTrackIsShow = false\n    map.trackService && (hasTrackIsShow = map.trackService.hasTrackIsShow())\n    this.setNoSelShipIsShow(!hasTrackIsShow, false)\n  }\n  getShipByEvent(event: MouseEvent) {\n    return CanvasShipUtils.mouseInArr(\n      this._map.getPanes().canvasShipsPane,\n      event,\n      this._viewShips\n    )\n  }\n  private _mousemoveFunction(event: MouseEvent, _that: this) {\n    const ship: Ship | undefined = _that.getShipByEvent(event)\n    if (ship) {\n      _that._map.getPanes().canvasShipsPane.style.cursor = 'pointer'\n      if (ship.datapower !== undefined && ship.datapower == 1) {\n        return\n      }\n      clearTimeout(_that._mouseMoveTimer)\n      _that._mouseMoveTimer = setTimeout(() => {\n        if (\n          (_that._map._hoverShipId &&\n            ship.shipid === _that._map._hoverShipId) ||\n          (!_that._map._hoverShipId\n            ? ((_that._map._hoverShipId = ship.shipid),\n              _that._drawShips(),\n              _that._openTooltip(event, _that._map, ship))\n            : false)\n        ) {\n          // 如果条件满足则执行_openTooltip等操作\n        }\n      }, 500)\n    } else {\n      clearTimeout(_that._mouseMoveTimer)\n      _that._closeTooltip()\n      _that._map.getPanes().canvasShipsPane.style.cursor = 'inherit'\n      if (_that._map._hoverShipId) {\n        _that._map._hoverShipId = null\n        _that._drawShips()\n      }\n    }\n  }\n\n  private _openTooltip(event: MouseEvent, map: MyMap, ship: any) {\n    this._tooltip && CanvasShipUtils.closeTooltip(map, this._tooltip)\n    const mouseLatlng = this._getMouseLatlng(event, map)\n    const tooltipHtml = this._getTooltipHtml(ship)\n    if (!isEmpty(tooltipHtml)) {\n      this._tooltip = CanvasShipUtils.openTooltip(\n        this._map,\n        mouseLatlng,\n        tooltipHtml,\n        {\n          direction: 'auto',\n          offset: [0, 0],\n          opacity: 0.8,\n        }\n      )\n    }\n  }\n  _getMouseLatlng(event: MouseEvent, map: MyMap) {\n    const mousePos = CanvasShipUtils.getMousePos(\n      map.getPanes().canvasShipsPane,\n      event\n    )\n    return map.containerPointToLatLng(new L.Point(mousePos[0], mousePos[1]))\n  }\n  _getTooltipHtml(ship: CanvasShip) {\n    let html = ''\n    const tooltipData = this._getTooltipData(ship) as any\n    if (isEmpty(this.options.tooltip_fields)) {\n      this.options.tooltip_fields = [\n        'name',\n        'callsign',\n        'imo',\n        'mmsi',\n        'lastdyn',\n      ]\n    }\n    for (let i = 0; i < this.options.tooltip_fields.length; i++) {\n      const tooltipField = this.options.tooltip_fields[i]\n      let tooltipTxt = ''\n      if (\n        !(\n          isEmpty(tooltipData) ||\n          isEmpty(tooltipData[tooltipField]) ||\n          isEmpty((this._tooltip_txt_templater as any)[tooltipField])\n        )\n      ) {\n        tooltipTxt = (this._tooltip_txt_templater as any)[tooltipField].replace(\n          '{1}',\n          tooltipData[tooltipField]\n        )\n      }\n      html += tooltipTxt\n    }\n    return html\n  }\n  _getTooltipData(ship: CanvasShip): CanvasShip {\n    const shepEntity = ship\n    shepEntity.name = ship.name\n    if (shepEntity.lastdyn) {\n      let lastdynFormat =\n        `${shepEntity.lastdyn}`.indexOf('-') > 0 ||\n        `${shepEntity.lastdyn}`.indexOf('/') > 0\n          ? new Date(shepEntity.lastdyn).getTime()\n          : 1000 * shepEntity.lastdyn\n      this.options.offsetLastdyn &&\n        (lastdynFormat += 1000 * this.options.offsetLastdyn)\n      shepEntity.lastdyn = CanvasShipUtils.dataFormat(\n        lastdynFormat,\n        'YYYY-MM-DD HH:mm:ss'\n      ) as any\n    }\n    shepEntity.navistatus &&\n      (shepEntity.navistatus = CanvasShipUtils.getDisValue(\n        shepEntity.navistatus,\n        'naviStatus',\n        'zh_CN'\n      ))\n    shepEntity.sog && (shepEntity.sog = CommUtils.getNumber(shepEntity.sog, 1))\n    // '0' == shepEntity.sog && (shepEntity.sog = 0)\n    shepEntity.cog && (shepEntity.cog = CommUtils.getNumber(shepEntity.cog, 1))\n    shepEntity.hdg && (shepEntity.hdg = CommUtils.getNumber(shepEntity.hdg, 1))\n    shepEntity.rot && (shepEntity.rot = CommUtils.getNumber(shepEntity.rot, 1))\n    shepEntity.draught &&\n      (shepEntity.draught = CommUtils.getNumber(shepEntity.draught, 1))\n    shepEntity.type &&\n      (shepEntity.type = CanvasShipUtils.getShipTypeCN(\n        shepEntity.type as number\n      ))\n    shepEntity.newtype &&\n      (shepEntity.newtype = CanvasShipUtils.getDisValue(\n        shepEntity.newtype,\n        'shipType',\n        'zh_CN'\n      ))\n    shepEntity.lat &&\n      (shepEntity.lat = CanvasShipUtils.latFormatter(shepEntity.lat) as any)\n    shepEntity.lng &&\n      (shepEntity.lng = CanvasShipUtils.lngFormatter(shepEntity.lng) as any)\n    // '0' == shepEntity.imo && (shepEntity.imo = null)\n    shepEntity.seaareaid &&\n      (shepEntity.seaareaid = CanvasShipUtils.getDisValue(\n        shepEntity.seaareaid,\n        'seaArea',\n        'zh_CN'\n      ))\n    return shepEntity\n  }\n\n  _closeTooltip() {\n    if (this._tooltip) {\n      this._map.removeLayer(this._tooltip)\n      this._tooltip = null\n    }\n  }\n  _callBackObjBuild(ship: CanvasShip) {\n    const shipExtend = ship\n    this.options.offsetLastdyn &&\n      (shipExtend.lastdyn += this.options.offsetLastdyn)\n    return shipExtend\n  }\n  _updateShips(ships: CanvasShip[]): void {\n    if (ships && ships.length !== 0) {\n      if (!this._grid_ships.getItemCount()) {\n        this._grid_ships.updateDatas(ships, true)\n        this._drawShips()\n        return\n      }\n\n      const beidouShips: CanvasShip[] = []\n\n      for (const ship of ships) {\n        if (ship && ship.lat && ship.lng) {\n          const shipByPk = this._grid_ships.getItemByPK(ship.shipid)\n          if (!CommUtils.isEmpty(shipByPk)) {\n            if (\n              this._fleetShips &&\n              this._fleetShips[shipByPk.mmsi.toString()] &&\n              ship.source !== 2\n            ) {\n              ship.custom_name =\n                this._fleetShips[shipByPk.mmsi.toString()].custom_name\n              ship.name = this._fleetShips[shipByPk.mmsi.toString()].name\n              ship.color = this._fleetShips[shipByPk.mmsi.toString()].color\n              ship.istop = this._fleetShips[shipByPk.mmsi.toString()].istop\n              ship.group_name =\n                this._fleetShips[shipByPk.mmsi.toString()].group_name\n              ship.remark = this._fleetShips[shipByPk.mmsi.toString()].remark\n              ship.shiptype = 2\n            } else if (ship.source !== 2) {\n              ship.shiptype = 1\n              this._specialShips[shipByPk.shipid] &&\n                ((ship.istop = true), (ship.color = shipByPk.color))\n            }\n\n            if (this.options.enableTracks) {\n              const tracks = shipByPk.tracks || []\n              if (tracks.length > 0) {\n                const track = tracks[tracks.length - 1]\n                const latDiff = Math.abs(track.lat - ship.lat)\n                const lngDiff = Math.abs(track.lng - ship.lng)\n                if (\n                  latDiff > 0 &&\n                  lngDiff > 0 &&\n                  latDiff <= 0.333 &&\n                  lngDiff <= 0.333 &&\n                  (!ship.lastdyn_active ||\n                    !shipByPk.lastdyn_active ||\n                    ship.lastdyn > shipByPk.lastdyn)\n                ) {\n                  let lastDyn = ship.lastdyn\n                  if (track.time > lastDyn && !ship.lastdyn_active) {\n                    lastDyn = track.time + 1\n                  }\n                  shipByPk.tracks.push({\n                    lat: ship.lat,\n                    lng: ship.lng,\n                    time: lastDyn,\n                    updtime: Date.now(),\n                  })\n                } else {\n                  console.debug(shipByPk.mmsi, '3分钟轨迹点超出1/3度，丢弃')\n                }\n              } else {\n                shipByPk.tracks.push({\n                  lat: ship.lat,\n                  lng: ship.lng,\n                  time: ship.lastdyn,\n                  updtime: Date.now(),\n                })\n              }\n              ship.tracks = []\n              const cutOffTime = ship.lastdyn - 180\n              for (let j = 0; j < shipByPk.tracks.length; j++) {\n                const point = shipByPk.tracks[j]\n                if (\n                  point.time >= cutOffTime &&\n                  (ship.tracks.length === 0 ||\n                    ship.tracks[ship.tracks.length - 1].time !== point.time)\n                ) {\n                  ship.tracks.push(point)\n                } else {\n                  console.debug(shipByPk.mmsi, '3分钟轨迹点超时，丢弃')\n                }\n              }\n            }\n\n            if (\n              ((shipByPk.datapower === 0 || !shipByPk.datapower) &&\n                ship.datapower == 1) ||\n              (ship.source &&\n                shipByPk.source &&\n                ship.source !== shipByPk.source &&\n                ship.lastdyn < shipByPk.lastdyn)\n            ) {\n              continue\n            }\n          }\n\n          const shipMmsi = this.getShipByMmsi(ship.mmsi, false)\n          if (shipMmsi) {\n            ship.shipid = `${shipMmsi.shipid}`\n          }\n          const key = `${this._DShips_key}${ship.mmsi}`\n          if (key in this._DShips) {\n            ship.color = this.options.dShipColor\n            ship.istop = true\n            ship.shiptype = 2\n          }\n\n          if (ship.source === 3 || this._beidou_ships.includes(ship.shipid)) {\n            ship.source_real = ship.source\n            ship.source = 3\n            if (!this._beidou_ships.includes(ship.shipid)) {\n              this._beidou_ships.push(ship.shipid)\n            }\n          }\n          beidouShips.push(ship)\n        } else {\n          console.log('ships 数据非法！', ship)\n        }\n      }\n\n      this._grid_ships.updateDatas(beidouShips)\n      this._drawShips()\n    }\n  }\n\n  _drawShips(e?: L.LeafletEvent | undefined) {\n    const startTime = Date.now()\n    this.clearAllShips()\n    const topList: CanvasShip[] = []\n    let filterList: CanvasShip[] = []\n    const selShips: CanvasShip[] = []\n    const selShipId = this._map._selShipId\n    const hoverShipList: CanvasShip[] = []\n    const hoverShipId = this._map._hoverShipId\n    const zoom = this._map.getZoom()\n    const ItemCount = this._grid_ships.getItemCount()\n    console.log(`catch ships total length:${ItemCount}`)\n    if (ItemCount) {\n      let bounds = this._map.getBounds()\n      if (zoom < 12) {\n        const slat = bounds.getSouthWest().lat - 0.05\n        const slng = bounds.getSouthWest().lng - 0.05\n        const nlat = bounds.getNorthEast().lat + 0.05\n        const nlng = bounds.getNorthEast().lng + 0.05\n        bounds = L.latLngBounds(\n          new L.LatLng(slat, slng),\n          new L.LatLng(nlat, nlng)\n        )\n      }\n      let drawShips: CanvasShip[] = []\n      if (zoom <= this.options.zoomLevel_base) {\n        // 特殊船舶\n        const specialShipInfo: Record<string, any> = {}\n        for (const key in this._specialShips) {\n          const ship = this.getShipByShipid(key)\n          ship && (specialShipInfo[`${ship.shipid}`] = ship)\n        }\n        // 舰队船舶\n        for (const mmsi in this._fleetShips) {\n          const ship = this.getShipByMmsi(mmsi, false)\n          if (ship) {\n            specialShipInfo[`${ship.shipid}`] = ship\n          }\n        }\n        const dShips = Object.keys(this._DShips)\n        for (const dShip of dShips) {\n          const ship = this.getShipByMmsi(this._DShips[dShip].mmsi, false)\n          if (ship) {\n            specialShipInfo[`${ship.shipid}`] = ship\n          }\n        }\n\n        for (const key in this._map._selShipId) {\n          const shipId = this._getKeyShipid_de(key)\n          const ship = this.getShipByShipid(shipId)\n          specialShipInfo[`${ship?.shipid || shipId}`] = ship\n        }\n        Object.keys(specialShipInfo).forEach((key) => {\n          let lat = specialShipInfo[key].lat\n          let lng = specialShipInfo[key].lng\n          if (this._map.offsetC) {\n            const latLngOffset = GPS.gcj_encrypt(\n              lat,\n              lng,\n              specialShipInfo[key].outCN\n            )\n            lat = latLngOffset.lat\n            lng = latLngOffset.lon\n          }\n          if (!bounds.contains([lat, lng])) {\n            if (bounds.contains([lat, lng + 360])) {\n              specialShipInfo[key].offset = 360\n            }\n            if (bounds.contains([lat, lng - 360])) {\n              specialShipInfo[key].offset = -360\n            }\n          }\n          drawShips.push(specialShipInfo[key])\n        })\n      } else {\n        const splitLatLngBounds = CanvasShipUtils.getSplitLatLngBounds(\n          bounds,\n          zoom\n        )\n        for (const splitLatLngBound of splitLatLngBounds) {\n          const itemByBounds = this._grid_ships.getItemByBounds(\n            splitLatLngBound.bounds\n          )\n          for (const itemByBound of itemByBounds) {\n            itemByBound.offset = splitLatLngBound.offset\n            drawShips.push(itemByBound)\n          }\n        }\n      }\n      console.debug('get catch ships time:', Date.now() - startTime)\n      this.options.drawShipsBeforeCallBack &&\n        (drawShips = this.options.drawShipsBeforeCallBack(drawShips))\n      let isOpenShipsViewFilter = 0\n      // 网格大小\n      let gridSize = 0.05\n      if (\n        this.options.drawBaseShipsGridMaxCount > 0 &&\n        drawShips.length > this.options.drawBaseShipsGridMaxCount\n      ) {\n        const index = this.options.drawBaseShipsGridZoom.indexOf(zoom)\n        if (index >= 0 && this.options.drawBaseShipsGridMax.length > index) {\n          isOpenShipsViewFilter = this.options.drawBaseShipsGridMax[index]\n          gridSize = this.options.drawBaseShipsGridSize[index] || 0.05\n        }\n      }\n      // 遍历所有需要绘制的船只\n      for (const [i, ship] of drawShips.entries()) {\n        const ShipidEn = this._getKeyShipid_en(ship.shipid)\n        //  drawShips[key].istop 停止是否渲染\n        // 如果当前地图缩放级别大于基础缩放级别，或者特定过滤条件下，继续处理船舶数据\n        if (\n          !(zoom <= this.options.zoomLevel_base) ||\n          (selShipId && ShipidEn in selShipId) ||\n          ship.istop\n        ) {\n          // 创建新的船只对象\n          let canvasShip = new CanvasShip()\n          canvasShip = L.Util.extend(canvasShip, ship)\n          // 如果存在缓存且满足条件，则设置船舶颜色、是否置顶等属性\n          if (this._DShips_key + canvasShip.mmsi in this._DShips) {\n            canvasShip.color = this.options.dShipColor\n            canvasShip.istop = true\n            canvasShip.shiptype = 2\n          }\n          // 计算经纬度并考虑中国偏移\n          let latLngOffset = L.latLng(\n            canvasShip.lat,\n            canvasShip.lng + canvasShip.offset\n          ) as any\n          // 如果启用了坐标偏移，则进行加密处理\n          if (this._map.offsetC) {\n            latLngOffset = GPS.gcj_encrypt(\n              latLngOffset.lat,\n              latLngOffset.lng,\n              canvasShip.outCN\n            )\n            latLngOffset = new L.LatLng(latLngOffset.lat, latLngOffset.lon)\n          }\n          // 检查船舶位置是否在当前视图范围内\n          if (bounds.contains(latLngOffset)) {\n            // 确保船只数据有效\n            if (canvasShip && canvasShip.lat && canvasShip.lng) {\n              canvasShip.arr_index = i\n              canvasShip.updateState(this._srvTime)\n\n              const gridShip = this._grid_ships.getItemByPK(canvasShip.shipid)\n              gridShip.state = canvasShip.state\n              // TODO: 新增功能点\n              // if (\n              //   !gridShip.is_netsonde ||\n              //   (this.options.netsondeOptions &&\n              //     this.options.netsondeOptions.show)\n              // ) {\n              // }\n              // 判断是否为\"云珍\"或\"海监\"船\n              if (!canvasShip.is_yh) {\n                canvasShip.is_yh = CanvasShipUtils.isYUNZHENAndHAIJIAN(\n                  canvasShip.name,\n                  canvasShip.mmsi,\n                  canvasShip\n                )\n              }\n\n              // 根据不同条件选择性绘制船舶\n              if (canvasShip.is_yh) {\n                // && !(Object.keys(selShipId).length && ShipidEn in selShipId)\n                if (Object.keys(selShipId).length && ShipidEn in selShipId) {\n                  selShips.push(canvasShip)\n                  this._topShipsCount++\n                } else if (\n                  this._isFilter(canvasShip) &&\n                  this._isValidIMO(canvasShip) &&\n                  this._noSelShipIsShow\n                ) {\n                  if (\n                    this._areaShipIsShow\n                    // (!this._areaShipIsShow && 1 == canvasShip.shiptype) ||\n                    // (2 == canvasShip.state && 1 == canvasShip.shiptype)\n                  ) {\n                    if (hoverShipId && canvasShip.shipid == hoverShipId) {\n                      hoverShipList.push(canvasShip)\n                    } else if (canvasShip.istop) {\n                      topList.push(canvasShip)\n                      this._topShipsCount++\n                    } else if (zoom > this.options.zoomLevel_base) {\n                      this._baseShipsCount++\n                      if (isOpenShipsViewFilter > 0) {\n                        filterList.push(canvasShip)\n                      } else {\n                        this._drawShip(canvasShip)\n                      }\n                    }\n                  }\n                }\n              }\n            } else {\n              console.log('drawShips ship 数据非法！', canvasShip)\n            }\n          }\n        }\n      }\n      if (isOpenShipsViewFilter > 0) {\n        this._grid_ships_view_filter = new Map<string, any>()\n        const lengthBuckets = [\n          { name: 'l_90', limit: 90 },\n          { name: 'l_80', limit: 80 },\n          { name: 'l_70', limit: 70 },\n          { name: 'l_60', limit: 60 },\n          { name: 'l_50', limit: 50 },\n          { name: 'l_40', limit: 40 },\n          { name: 'l_30', limit: 30 },\n        ]\n\n        filterList.forEach((ship) => {\n          const gridKey = CanvasShipUtils.getGridKeyByLatLng(\n            ship.lat,\n            ship.lng,\n            gridSize,\n            'g_',\n            '_'\n          )\n\n          let gridData = this._grid_ships_view_filter.get(gridKey)\n          if (!gridData) {\n            gridData = {\n              ship: [],\n              ...lengthBuckets.reduce(\n                (acc, { name }) => ({ ...acc, [name]: [] }),\n                {}\n              ),\n            }\n            this._grid_ships_view_filter.set(gridKey, gridData)\n          }\n\n          const bucket = lengthBuckets.find(({ limit }) => ship.length <= limit)\n          if (bucket) {\n            gridData[bucket.name].push(ship)\n          }\n        })\n\n        const uniqueShipIds = new Set()\n        const filteredShips: any[] = []\n\n        for (const [, gridData] of this._grid_ships_view_filter) {\n          let mergedShips: any[] = []\n          for (const { name } of lengthBuckets) {\n            gridData[name].some((ship: any) => {\n              const shipId = ship.mmsi || ship.shipid\n              if (!uniqueShipIds.has(shipId)) {\n                mergedShips.push(ship)\n                uniqueShipIds.add(shipId)\n                if (mergedShips.length >= isOpenShipsViewFilter) {\n                  return true // 提前终止循环\n                }\n              }\n              return false\n            })\n\n            if (mergedShips.length >= isOpenShipsViewFilter) {\n              mergedShips = mergedShips.slice(0, isOpenShipsViewFilter)\n              break // 如果达到限制，退出循环\n            }\n          }\n          gridData.ship = mergedShips\n          filteredShips.push(...mergedShips)\n        }\n\n        filterList = [] // 清空原始列表\n        console.debug('区域船抽稀时间:', Date.now() - startTime)\n        // requestAnimationFrame(() => {})\n        filteredShips.forEach((item) => {\n          this._drawShip(item)\n        })\n        this._baseShipsCount_chouxi = filteredShips.length\n      }\n      topList.forEach((item) => this._drawShip(item, { isSelected: false }))\n\n      hoverShipList.forEach((item) => {\n        this._drawShip(item, {\n          lineColor: 'red',\n          heightLineColor: 'red',\n          isSelected: false,\n          radarOptions: {\n            lineColor: 'red',\n            heightLineColor: 'red',\n          },\n        })\n      })\n\n      selShips.forEach((item) => {\n        this._drawShip(item, {\n          lineColor: 'red',\n          heightLineColor: 'red',\n          isSelected: true,\n        })\n      })\n      this._drawLablesFn(this._drawLables)\n      this.options.isAutoUpdateSrvtime && this._updateSrvTime()\n      setTimeout(() => {\n        this._drawShipsEnd(e)\n      }, 50)\n      console.log(`_drawShips time:${Date.now() - startTime}`)\n      console.log(`_drawShips _topShipsCount:${this._topShipsCount}`)\n      console.log(`_drawShips _baseShipsCount:${this._baseShipsCount}`)\n      console.log(\n        `_drawShips _baseShipsCount_chouxi:${this._baseShipsCount_chouxi}`\n      )\n      console.log(`_drawShips _drawCount:${this._drawCount}`)\n    }\n  }\n\n  private _drawShipsEnd(event?: L.LeafletEvent): void {\n    if (this.options.drawShipsEndCallBack) {\n      this.options.drawShipsEndCallBack({\n        map: this._map,\n        viewShips: this._viewShips,\n        count: this._drawCount,\n        viewShipLength: this._viewShips.length,\n        zoom: this._map.getZoom(),\n        event,\n      })\n    }\n  }\n  /**\n   *  WGS-84：是国际标准，GPS坐标（Google Earth使用、或者GPS模块）\n   *  GCJ-02：中国坐标偏移标准，Google Map、高德、腾讯使用\n   *  BD-09：百度坐标偏移标准，Baidu Map使用\n   */\n  // 定义绘制单个船只的方法\n  private _drawShip(drawShipItem: CanvasShip, customOptions?: any) {\n    if (\n      drawShipItem &&\n      !Number.isNaN(drawShipItem.lat) &&\n      !Number.isNaN(drawShipItem.lng)\n    ) {\n      let newLatLng: L.LatLng\n\n      // 如果存在地图偏移系数（中国国测局坐标系转换），则进行坐标转换\n      if (this._map.offsetC) {\n        const WGS84ToGCJ02 = GPS.gcj_encrypt(\n          drawShipItem.lat,\n          drawShipItem.lng,\n          drawShipItem.outCN\n        )\n        newLatLng = new L.LatLng(WGS84ToGCJ02.lat, WGS84ToGCJ02.lon)\n      } else {\n        newLatLng = drawShipItem.getLatlng()\n      }\n\n      const options = Object.assign({}, this.options)\n\n      // 合并配置选项\n      const mergedOptions = cloneDeep(\n        merge(options, options.shipOptions, customOptions)\n      )\n      // 获取或设置颜色回调\n      const resetShipColorCallback = options.resetShipColorCallBack\n      mergedOptions.color =\n        (resetShipColorCallback &&\n          resetShipColorCallback.call(options, newLatLng)) ||\n        drawShipItem.color ||\n        this._clrState[drawShipItem.state]\n\n      // 设置线条和其他样式属性\n      mergedOptions.lineColor =\n        drawShipItem.lineColor || mergedOptions.lineColor\n      mergedOptions.heightLineColor =\n        drawShipItem.heightLineColor || mergedOptions.heightLineColor\n      mergedOptions.mapType = this._map.mapType\n      mergedOptions.labelImages = this._labelImages\n      mergedOptions.radarOptions = this.options.radarOptions\n\n      if (customOptions?.radarOptions) {\n        mergedOptions.radarOptions = {\n          ...mergedOptions.radarOptions,\n          ...customOptions.radarOptions,\n        }\n      }\n      // mergedOptions.netsondeOptions = this.options.netsondeOptions\n      // if (customOptions.netsondeOptions) {\n      //   mergedOptions.netsondeOptions = {\n      //     ...mergedOptions.netsondeOptions,\n      //     ...customOptions.netsondeOptions,\n      //   }\n      // }\n      if (this.options.shipSizeZoom && this.options.shipSizeZoom > 0) {\n        mergedOptions.sizeZoom = this.options.shipSizeZoom || 1\n      }\n\n      const canvasShipItem = canvasShipSymbol(\n        newLatLng,\n        this._map,\n        drawShipItem,\n        mergedOptions\n      )\n      canvasShipItem.state = drawShipItem.state\n\n      // 更新现有船只数据或添加新船只\n      const existingShip = this._grid_ships.getItemByPK(canvasShipItem.shipid)\n      if (existingShip) {\n        existingShip.bodyArea = canvasShipItem.bodyArea\n        existingShip.x = canvasShipItem.x\n        existingShip.y = canvasShipItem.y\n        existingShip.head_x = canvasShipItem.head_x\n        existingShip.head_y = canvasShipItem.head_y\n        existingShip.latlngReal = canvasShipItem.latlngReal\n        existingShip.pointCenterReal = canvasShipItem.pointCenterReal\n        existingShip.pointCenterGPS = canvasShipItem.pointCenterGPS\n        existingShip.rotate = canvasShipItem.rotate\n        existingShip.latlng = canvasShipItem.latlng\n      }\n\n      delete canvasShipItem.options.isSelected\n      this._viewShips.push(merge(drawShipItem, canvasShipItem))\n      this._drawCount++\n      this._zoomLevel = this._map.getZoom()\n\n      // 绘制船只标签逻辑\n      const shipIdEncoded = this._getKeyShipid_en(drawShipItem.shipid)\n      if (\n        this._zoomLevel >= this.options.weixingLabelZoom ||\n        (drawShipItem.istop && this._zoomLevel >= this.options.topLabelZoom) ||\n        this._zoomLevel >= this.options.generalLabelZoom ||\n        (this._map._selShipId && shipIdEncoded in this._map._selShipId)\n      ) {\n        let labelText: string\n        if ('en' === this.options.labelLanguage) {\n          labelText =\n            drawShipItem.labelText || drawShipItem.nameen || drawShipItem.name\n        } else {\n          labelText =\n            drawShipItem.labelText ||\n            drawShipItem.cnname ||\n            drawShipItem.name ||\n            '未匹配到名称'\n        }\n\n        const showLabelTextWithTime = drawShipItem.isShowLableTime\n        if (\n          (showLabelTextWithTime ?? this.options.isShowLableTime) &&\n          showLabelTextWithTime &&\n          !CommUtils.isEmpty(labelText)\n        ) {\n          const lastUpdateTimestamp = Date.now() - 1000 * drawShipItem.lastdyn\n          if (drawShipItem.lastdyn && lastUpdateTimestamp >= 21600000) {\n            const dateTime = CanvasShipUtils.dataFormat(\n              new Date(1000 * drawShipItem.lastdyn),\n              '(MM-DD HH:mm)'\n            )\n            labelText += dateTime\n          }\n        }\n\n        // 如果 `drawShipItem.source` 存在且非空，或者 `drawShipItem.source` 等于2\n        if (drawShipItem.source === 1 || drawShipItem.source === 2) {\n          // 如果 `drawShipItem.datapower` 为真，则清空 `lang` 变量\n          if (drawShipItem.datapower === 1) {\n            labelText = ''\n          }\n          // 绘制标签（在这种情况下不依赖于地图缩放级别和选中状态）\n          this._drawLabel(canvasShipItem, drawShipItem, labelText)\n        } else {\n          // 当满足以下条件之一时，绘制标签：\n          //   1. 当前地图缩放级别大于等于通用标签显示的最小缩放级别\n          //   2. 地图上已选择特定船舶ID，且当前shipEn存在于已选择的船舶ID列表中\n          //   3. drawShipItem 的 istop 属性为真，并且当前地图缩放级别大于等于顶级标签显示的最小缩放级别\n          if (\n            this._zoomLevel >= this.options.generalLabelZoom ||\n            (this._map._selShipId && shipIdEncoded in this._map._selShipId) ||\n            (drawShipItem.istop && this._zoomLevel >= this.options.topLabelZoom)\n          ) {\n            this._drawLabel(canvasShipItem, drawShipItem, labelText)\n          }\n        }\n      }\n\n      return canvasShipItem\n    }\n  }\n\n  // 定义用于绘制船只标签的方法\n  _drawLabel(shipInfo: any, Config: CanvasShip, labelText: string): void {\n    // 检查是否应显示标签，优先级：传入配置 > 默认配置\n    const showLabel = !Config.isShowLabel\n      ? this.options.isShowLabel\n      : Config.isShowLabel\n    const validSource =\n      Config.source !== null && ![1, 2, 3, 0, 'shipxy'].includes(Config.source)\n    const hasLabelText = !isEmpty(labelText)\n    const shouldShowLabel =\n      showLabel && shipInfo && Config && !validSource && hasLabelText\n    if (shouldShowLabel) {\n      let avoidOverlap = true\n      const point = new L.Point(shipInfo.x, shipInfo.y)\n      // 判断该船只ID是否在选中船只集合内，如果是，则避免标签重叠\n      if (this._getKeyShipid_en(Config.shipid) in this._map._selShipId) {\n        avoidOverlap = false\n      }\n\n      // 获取船只身体区域的边界框面积\n      const boundingBoxArea = CanvasShipUtils.getBoundingBoxArea(\n        shipInfo.bodyArea\n      )\n      let minX = 0,\n        minY = 0,\n        maxX = 0,\n        maxY = 0\n      if (boundingBoxArea && boundingBoxArea.min) {\n        minX = boundingBoxArea.min.x\n        minY = boundingBoxArea.min.y\n      }\n      if (boundingBoxArea && boundingBoxArea.max) {\n        maxX = boundingBoxArea.max.x\n        maxY = boundingBoxArea.max.y\n      }\n\n      // 计算船只包围盒的半径（假设为圆形）\n      const radius = Math.round(\n        Math.sqrt(\n          (Math.abs(maxX - minX) / 2) ** 2 + (Math.abs(maxY - minY) / 2) ** 2\n        )\n      )\n      const sourceType = Config.source\n      let font = '600 12px Arial'\n      let txtColor = '#000000'\n      let lineColor = '#000000'\n      let lineFillColor = null\n      let obliqueLineColor = null\n      let labelRotate = null\n\n      // 合并默认选项与传入配置的选项\n      const mergedOptions = merge(this.options, Config.options) as any\n\n      // 根据地图类型选择相应的标签样式\n      if (\n        mergedOptions.lableTxtColorMapTypeDark.includes(\n          this._map.mapType as string\n        )\n      ) {\n        // 使用暗色主题样式\n        font = mergedOptions.lableFont[1]\n        txtColor = mergedOptions.lableTxtColor[1]\n        lineColor = mergedOptions.lableLineColor[1]\n        lineFillColor = mergedOptions.lableLinefillColor[1]\n        obliqueLineColor = mergedOptions.obliqueLineColor[1]\n        labelRotate = mergedOptions.lableRotate[1]\n      } else {\n        // 使用亮色主题样式\n        font = mergedOptions.lableFont[0]\n        txtColor = mergedOptions.lableTxtColor[0]\n        lineColor = mergedOptions.lableLineColor[0]\n        lineFillColor = mergedOptions.lableLinefillColor[0]\n        obliqueLineColor = mergedOptions.obliqueLineColor[0]\n        labelRotate = mergedOptions.lableRotate[0]\n      }\n\n      // 如果配置中有自定义文本颜色，则覆盖默认或暗/亮色主题的颜色\n      if (!isEmpty(Config.txt_color)) {\n        txtColor = Config.txt_color\n      }\n\n      // 获取标签对应的图片信息\n      const labelImage = this._getLabelImageInfo(shipInfo._ship)\n\n      // 计算标签布局信息\n      const calculatedLabel = CanvasShipUtils.calcLabel(\n        this._map,\n        point,\n        labelText,\n        this._labels,\n        radius,\n        avoidOverlap,\n        font,\n        labelImage\n      )\n\n      // 如果成功计算出标签布局，则将其添加到待绘制队列和全局标签列表中\n      if (calculatedLabel) {\n        this._drawLables.push({\n          symbol: shipInfo,\n          calcLabel: calculatedLabel,\n          sourceType,\n          labelImage,\n          labelText,\n          txtColor,\n          font,\n          lineColor,\n          lineFillColor,\n          obliqueLineColor,\n          lableRotate: labelRotate,\n        })\n        this._labels.push(calculatedLabel)\n      }\n    }\n  }\n  _drawLablesFn(drawLables: string | any[]) {\n    if (drawLables)\n      for (const drawLable of drawLables) {\n        drawLable.symbol.drawLable(\n          drawLable.calcLabel,\n          drawLable.labelImage,\n          drawLable.labelText,\n          drawLable.txtColor,\n          drawLable.font,\n          drawLable.labelRotate,\n          drawLable.lineColor,\n          drawLable.lineFillColor,\n          drawLable.obliqueLineColor\n        )\n      }\n  }\n\n  /**\n   * 获取绘制label图标信息\n   * @param shipItem 船舶对象\n   * @param imgSize 图标大小\n   * @param imgOffset 偏移量\n   * @returns {isDraw:是否绘制,imgTypes:satellite:卫星|beidou:北斗|monitor:监控|monitor_nosign:监视器无信号,imgWidth:图标宽度,imgSize:图标大小,imgOffset:偏移量}\n   */\n  _getLabelImageInfo(\n    shipItem: CanvasShip,\n    imgSize = 16,\n    imgOffset = 4\n  ): {\n    isDraw: boolean\n    imgTypes: (\n      | 'common'\n      | 'satellite'\n      | 'dplus'\n      | 'beidou'\n      | 'monitor'\n      | 'monitor_nosign'\n    )[]\n    imgWidth: number\n    imgSize: number\n    imgOffset: number\n  } {\n    const isMonitor = shipItem.is_monitor\n    const isOline = this._checkShipIsMonitor(shipItem, true)\n\n    const imgTypes: (\n      | 'common'\n      | 'satellite'\n      | 'dplus'\n      | 'beidou'\n      | 'monitor'\n      | 'monitor_nosign'\n    )[] = []\n\n    switch (shipItem.source) {\n      case 0:\n        if (this._labelImages.common) {\n          imgTypes.push('common')\n        }\n        break\n      case 1:\n        if (this._labelImages.satellite) {\n          imgTypes.push('satellite')\n        }\n        break\n      case 2:\n        if (this._labelImages.dplus) {\n          imgTypes.push('dplus')\n        }\n        break\n      case 3:\n        if (this._labelImages.beidou) {\n          imgTypes.push('beidou')\n        }\n        break\n    }\n\n    if (isMonitor && this._labelImages.monitor) {\n      imgTypes.push(isOline ? 'monitor' : 'monitor_nosign')\n    }\n\n    const drawLength = imgTypes.length\n    const imgWidth = drawLength * (imgOffset + imgSize)\n\n    return {\n      isDraw: drawLength > 0,\n      imgTypes,\n      imgWidth,\n      imgSize,\n      imgOffset,\n    }\n  }\n\n  /**\n   * 设置是否显示label\n   * @param isShowLabel 是否显示label\n   */\n  setShowLabel(isShowLabel: boolean) {\n    this.options.isShowLabel = isShowLabel\n    this._drawShips()\n  }\n  _updateSrvTime(time?: number) {\n    this._srvTime = !time\n      ? Math.max(this._srvTime, Date.now() / 1000)\n      : Math.max(this._srvTime, time)\n  }\n  timerFunction(_this: this) {\n    if (\n      !_this.options.enableFleetShip &&\n      !_this.options.enableAreaShip &&\n      !_this.options.enableDShip &&\n      !_this.options.enableSelectedShip\n    ) {\n      _this.options.enableDShip && _this._requestDShip()\n      _this.options.enableFleetShip && _this._requestFleetShips_v3()\n      if (_this.options.enableAreaShip) {\n        _this._continue = 0\n        if (_this._timer_area_num) {\n          _this._timer_area_num = 0\n          _this._requestAreaShips_v3()\n        } else {\n          _this._timer_area_num = 1\n        }\n        !_this.options.enableSelectedShip && _this._requestSelectedShips()\n      }\n      _this.options.enableSelectedShip && _this._requestSelectedShips()\n      _this._requestGreenShips()\n      if (_this._requestAreaShips && _this._requestAreaShips.length > 0) {\n        _this._drawRequestShips(_this)\n      } else {\n        setTimeout(_this._drawRequestShips, 800, _this)\n        if (_this._timerOpen) {\n          _this._map.getZoom() <= _this.options.zoomLevel_base\n            ? (_this._delayTime = 60000)\n            : (_this._delayTime = Math.max(5000, _this.options.delayTime))\n          _this._timer && clearTimeout(_this._timer)\n          _this._timer = setTimeout(\n            _this.timerFunction,\n            _this._delayTime,\n            _this\n          )\n        }\n        console.log('ships timer runed!')\n      }\n    }\n  }\n  _drawRequestShips(_that: this) {\n    const areaShips = _that._requestAreaShips\n    _that._requestAreaShips.splice(0, areaShips.length)\n    _that.options.drawRequestShipsBeforeCallback &&\n      _that.options.drawRequestShipsBeforeCallback(areaShips)\n    _that._updateShips(areaShips)\n    if (_that._selectedShipUpdateListener && _that._map._selShipId) {\n      for (const id in _that._map._selShipId) {\n        const shipId = _that._getKeyShipid_de(id)\n        const ship = _that.getShipByShipid(shipId)\n        if (ship) {\n          _that._selectedShipUpdateListener(_that._callBackObjBuild(ship))\n          break\n        }\n      }\n    }\n  }\n  _timerStart() {\n    this._timerStop()\n    this._timerOpen = true\n    this.timerFunction(this)\n  }\n  _timerStop() {\n    this._timerOpen = false\n    if (this._timer) {\n      clearTimeout(this._timer)\n      this._timer = null\n    }\n  }\n  _isValidIMO(ship: CanvasShip) {\n    return (\n      !ship ||\n      !this._filterOptions ||\n      !this._filterOptions.validIMO ||\n      !this._filterOptions.validIMO ||\n      (!isEmpty(ship.imo) && /[1-9](\\d){6}/.test(ship.imo))\n    )\n  }\n  /**\n   * 条件判定是否显示不显示\n   * @param ship 船舶信息\n   * @returns\n   */\n  _isFilter(ship: CanvasShip): boolean {\n    let isFiltered = false\n    let shipType: string = CanvasShipUtils.getShipTypeCN(ship.type as any)\n    ship.newtype &&\n      (shipType = CanvasShipUtils.getNewShipTypeCN(\n        Number.parseInt(ship.newtype)\n      ))\n    const length = ship.length || 0\n    const hdg = ship.hdg || 511\n    const sog = ship.sog || 0\n    // const navistatus = ship.navistatus?.toString() || ''\n\n    if (this._filterOptions) {\n      let isLengthMatched = false\n      let isHdgMatched = false\n      let isSogMatched = false\n      let isCountryMatched = false\n\n      const shipTypeStr = `,${this._filterOptions.shipType},`\n      const shipLength = this._filterOptions.shipLength\n      const shipHdg = this._filterOptions.shipHdg\n      const shipSog = this._filterOptions.shipSog\n      // const shipNaviStatus = this._filterOptions.shipNaviStatus\n      const shipCountry = this._filterOptions.shipCountry\n\n      if (ship.istop) return true\n      if (!shipType) shipType = '其他'\n\n      if (\n        !(\n          this._filterOptions.shipType === undefined ||\n          !this._filterOptions.shipType ||\n          (shipType &&\n            shipType.length > 0 &&\n            shipTypeStr.includes(`,${shipType},`))\n        )\n      ) {\n        return false\n      }\n\n      if (shipLength.length > 0) {\n        for (const element of shipLength) {\n          const minLen = element[0]\n          const maxLen = element[1]\n          if (length >= minLen && length <= maxLen) {\n            isLengthMatched = true\n            break\n          }\n        }\n      } else {\n        isLengthMatched = true\n      }\n\n      if (!isLengthMatched) return false\n\n      if (shipHdg.length > 0) {\n        for (const element of shipHdg) {\n          const minHdg = element[0]\n          const maxHdg = element[1]\n          if (hdg >= minHdg && hdg <= maxHdg) {\n            isHdgMatched = true\n            break\n          }\n        }\n        if (!isHdgMatched) return false\n      } else {\n        isHdgMatched = true\n      }\n\n      if (\n        this._filterOptions.shipCustomSog &&\n        this._filterOptions.shipCustomSog.length > 0\n      ) {\n        for (let i = 0; i < this._filterOptions.shipCustomSog.length; i++) {\n          const sogRange = this._filterOptions.shipCustomSog[i]\n          if (sog >= sogRange[0] && sog <= sogRange[1]) {\n            isSogMatched = true\n            break\n          }\n        }\n        if (!isSogMatched) return false\n      } else {\n        let minSog = 0\n        let maxSog = 9999\n        const shipSogs = shipSog.split(',').filter(Boolean)\n\n        if (shipSogs.length === 2) {\n          minSog = 0\n          maxSog = 9999\n          isSogMatched = true\n        } else if (shipSogs.includes('1')) {\n          minSog = 1\n          maxSog = 9999\n        } else if (shipSogs.includes('0')) {\n          minSog = 0\n          maxSog = 1\n        } else {\n          minSog = 0\n          maxSog = 9999\n          isSogMatched = true\n        }\n\n        if ((!isSogMatched && sog < minSog) || sog >= maxSog) return false\n        isSogMatched = true\n      }\n\n      // TODO: 根据navistatus 进行过滤\n      // const naviStatusList = shipNaviStatus.split(',').filter((item) => !item)\n      // if (naviStatusList.length > 0 && !naviStatusList.includes(navistatus))\n      //   return false\n\n      if (isNull(ship.country)) {\n        ship.country = CanvasShipUtils.isCNShip(ship.mmsi)\n      }\n\n      if (shipCountry.length > 0) {\n        const countryCodes = shipCountry.split(',')\n        isCountryMatched =\n          !isNull(ship.country) && countryCodes.includes(`${ship.country}`)\n        if (!isCountryMatched && !isEmpty(ship.mmsi)) {\n          isCountryMatched = countryCodes.includes(`${ship.mmsi}`.slice(0, 3))\n        }\n      } else {\n        isCountryMatched = true\n      }\n\n      if (!isCountryMatched) return false\n\n      isFiltered =\n        isLengthMatched && isHdgMatched && isSogMatched && isCountryMatched\n    } else {\n      isFiltered = true\n    }\n\n    return isFiltered\n  }\n  /**\n   * 添加船舶\n   *  添加船舶，更新缓存，并绘制。\n   * @params ships\tArray\t船舶数组，[CanvasShip]，船舶属性必填项有：shipid、mmsi、lat、lng\n   */\n  addShips(ships: CanvasShip[]) {\n    if (ships) {\n      if (this.options.isAutoUpdateSrvtime) {\n        this._updateSrvTime()\n      }\n\n      for (const ship of ships) {\n        // 确保船舶MMSI有效\n        if (ship.mmsi && Number.parseInt(ship.mmsi) >= 1) {\n          // 判断是否为\"云珍\"或\"海监\"船舶\n          if (typeof ship.is_yh === 'undefined') {\n            ship.is_yh = CanvasShipUtils.isYUNZHENAndHAIJIAN(\n              ship.name,\n              ship.mmsi,\n              ship\n            )\n          }\n\n          // 判断船舶是否在中国境外\n          if (typeof ship.outCN === 'undefined') {\n            ship.outCN = GPS.outOfChina(ship.lat, ship.lng)\n          }\n\n          // 设置最后动态时间戳\n          if (typeof ship.lastdyn === 'undefined') {\n            ship.lastdyn = Date.now() / 1000\n          }\n\n          // 若船舶类型未定义，则设置为默认值1\n          if (CommUtils.isEmpty(ship.shiptype)) {\n            ship.shiptype = 1\n          }\n\n          // 根据船舶类型处理舰队船舶\n          if (ship.shiptype === 2) {\n            const mmsiStr = ship.mmsi.toString()\n            if (!(mmsiStr in this._fleetShips)) {\n              this._fleetShips[mmsiStr] = ship\n            }\n          } else {\n            const key = this._DShips_key + ship.mmsi\n            if (\n              ship.mmsi.toString() in this._fleetShips ||\n              key in this._DShips\n            ) {\n              ship.shiptype = 2\n            }\n          }\n        }\n      }\n\n      this._updateShips(ships)\n    }\n  }\n  /**\n   * 删除船通过船舶ID\n   *  除船通过船舶ID，船舶ID是，字符串，或逗号分割的字符串，或数组。\n   * @params shipsid\tstring | array\t船舶ID(字符串|逗号分割的字符串|数组)\n   */\n  deleteShipByShipID(shipsid: string | string[]) {\n    let shipIds: any[] = []\n    if (!isEmpty(shipsid)) {\n      shipIds =\n        'array' == CommUtils.getObjType(shipsid)\n          ? shipIds.concat(shipsid)\n          : (shipsid as string).split(',')\n      if (shipIds) {\n        for (const shipId of shipIds) {\n          this._grid_ships.deleteByPK(shipId)\n        }\n      }\n      this._drawShips()\n    }\n  }\n  /**\n   * 删除所有船舶\n   */\n  removeAllShips() {\n    this._scode = 0\n    this._grid_ships.deleteAll()\n    this._fleetShips && (this._fleetShips = {})\n    this._drawShips()\n  }\n  /**\n   * 添加关注船\n   * @params ships\tArray\t船舶数组，[CanvasShip]，船舶属性必填项有：shipid、mmsi、lat、lng\n   */\n  addFleetShips(ships: CanvasShip[]) {\n    if (ships) {\n      const fleetShips: CanvasShip[] = []\n      for (const ship of ships) {\n        ship.shiptype = 2\n        ship.istop = true\n        fleetShips.push(ship)\n      }\n      this.addShips(fleetShips)\n    }\n  }\n  /**\n   * 删除指定的关注船\n   * @params ships\tArray\t船舶mmsi数组，为空则删除所有关注船\n   */\n  deleteFleetShips(ships: string[] = []) {\n    this._fleetShips && (ships = Object.keys(this._fleetShips))\n    for (const ship of ships) {\n      ship in this._fleetShips && delete this._fleetShips[ship]\n      const shipByMMSI = this._grid_ships.getItemByMMSI(ship)\n      const shipKey = this._DShips_key + ship\n      if (!(isEmpty(shipByMMSI) || shipKey in this._DShips)) {\n        shipByMMSI.shiptype = 1\n        shipByMMSI.color = undefined\n        shipByMMSI.istop = false\n        shipByMMSI.custom_name = undefined\n      }\n    }\n    this._drawShips()\n  }\n  /**\n   * 删除所有关注船船舶\n   */\n  deleteAllFleetShips() {\n    this._fleetShips && this.deleteFleetShips()\n  }\n  /**\n   * 删除所有区域船船舶\n   */\n  deleteAllAreaShips() {\n    for (const item of this._grid_ships._items) {\n      if (item.shiptype) {\n        this._grid_ships.deleteByPK(item.shipid)\n      }\n    }\n    this._drawShips()\n  }\n  clearAllShips() {\n    this._drawCount = 0\n    this._topShipsCount = 0\n    this._baseShipsCount = 0\n    this._baseShipsCount_chouxi = 0\n    this._viewShips = []\n    this._labels = []\n    this._drawLables = []\n    const canvasShipsPane = this._map.getPanes().canvasShipsPane\n    if (canvasShipsPane) {\n      const context = (canvasShipsPane as any).getContext(\n        '2d'\n      ) as CanvasRenderingContext2D\n      context.clearRect(\n        0,\n        0,\n        Number.parseInt(canvasShipsPane.style.width),\n        Number.parseInt(canvasShipsPane.style.height)\n      )\n      context.save()\n    }\n  }\n  /**\n   * 船舶定位\n   * @params mmsi\tString\tmmsi\n   * @params isQueryURL\tString\t缓存查不到，是否查询数据接口,默认：true\n   */\n  locationShip(mmsi: string, isQueryURL = true, shipInfo?: CanvasShip) {\n    if (isNull(mmsi)) return null\n    const shipByMmsi = shipInfo\n      ? shipInfo\n      : this.getShipByMmsi(mmsi, isQueryURL)\n    if (shipByMmsi) {\n      this._map._selShipId = {}\n      const key = this._getKeyShipid_en(shipByMmsi.shipid)\n      this._map._selShipId[`${key}`] = shipByMmsi.shipid\n      this._updateShips([shipByMmsi])\n      let latLng = L.latLng(shipByMmsi.lat, shipByMmsi.lng)\n      latLng = CanvasShipUtils.GPSEncryptByMapToLatLng(latLng, this._map)\n      this._map.getZoom() < 9\n        ? this._map.setView(latLng, 9)\n        : this._map.setView(latLng)\n      if (this._selectedShipListener) {\n        setTimeout(() => {\n          this._selectedShipListener &&\n            this._selectedShipListener(this._callBackObjBuild(shipByMmsi))\n        }, 50)\n      }\n\n      return !shipByMmsi ? null : shipByMmsi\n    }\n    return null\n  }\n  /**\n   * 获取船舶信息(通过MMSI)\n   * @params mmsi\tString\tmmsi\n   * @params isQueryURL\tboolean\t缓存中查不到数据，是否查询数据接口,默认：true\n   */\n  getShipByMmsi(mmsi: string, isRequest: boolean): CanvasShip | null {\n    let itemByMMSI = null\n    if (isNull(mmsi)) return null\n    if (!isRequest) itemByMMSI = this._grid_ships.getItemByMMSI(mmsi)\n    else {\n      if (isRequest) {\n        const ship = this._requestShipByMmsi(mmsi)\n        if (ship.length > 0) {\n          itemByMMSI = ship[0] // 在检查长度大于0之后访问，不会触发错误\n        }\n      } else {\n        itemByMMSI = this._grid_ships.getItemByMMSI(mmsi)\n        if (!itemByMMSI) {\n          const ship = this._requestShipByMmsi(mmsi)\n          if (ship.length > 0) {\n            itemByMMSI = ship[0]\n          }\n        }\n      }\n    }\n    return !itemByMMSI ? null : itemByMMSI\n  }\n  /**\n   * 获取船舶信息(通过船舶ID)\n   * @params shipid\tString\t船舶ID\n   */\n  getShipByShipid(shipid: string | number) {\n    const ship = this._grid_ships.getItemByPK(shipid)\n    return isEmpty(shipid) || !ship ? null : ship\n  }\n  /**\n   * 设置船舶筛选条件\n      1、船舶类型\n      2、航速\n      3、船舶长度\n      4、船舶国籍\n      5、IMO是否合法\n   * @params options\tObject\t过滤设置，满足设置的条件将显示船舶，否则不现实\n   */\n  setFilter(options: any) {\n    L.Util.extend(this._filterOptions, options)\n    this._drawShips()\n  }\n  /**\n   * 获取船舶过滤条件\n   */\n  getFilter() {\n    return this._filterOptions\n  }\n  /**\n   * 添加船舶右键事件\n   *  添加船舶右键事件\n   * @Event listener\tfunction\t回调方法，返回参数：{\"shipid\":\"船舶唯一标识\",\"mmsi\":\"船舶的mmsi\"}\n   */\n  addRightContextmenuListener(\n    listener: (ship: Ship | null, style?: Record<string, any>) => void\n  ) {\n    this._rightContentMenu = listener\n  }\n  /**\n   * 移除船舶右键事件\n   */\n  removeRightContextmenuListener() {\n    this._rightContentMenu && (this._rightContentMenu = null)\n  }\n  /**\n   * 添加选中船舶事件\n   *  添加选中船舶事件，选中船舶时触发该事件\n   * @Event listener\tfunction\t回调方法，返回参数：{\"shipid\":\"船舶唯一标识\",\"mmsi\":\"船舶的mmsi\"}\n   */\n  addSelectedListener(listener: (params: any) => void) {\n    this._selectedShipListener = listener\n  }\n  /**\n   * 移除选中船舶事件\n   */\n  removeSelectedListener() {\n    this._selectedShipListener && (this._selectedShipListener = null)\n  }\n  /**\n   * 未选中船舶事件\n   * @Event listener\tfunction\t回调方法\n   */\n  addUnSelectedListener(listener: (params?: any) => void) {\n    this._map._unselectedShipListener = listener\n  }\n  /**\n   * 移除未选中船舶事件\n   */\n  removeUnSelectedListene() {\n    this._map._unselectedShipListener &&\n      (this._map._unselectedShipListener = undefined)\n  }\n  /**\n   * 添加选中船数据刷新事件\n   * @Event listener\tfunction\t回调方法\n   */\n  addSelectedShipUpdateListener(listener: (params?: any) => void) {\n    this._selectedShipUpdateListener = listener\n  }\n  /**\n   * 取消添加选中船数据刷新事件\n   */\n  removeSelectedShipUpdateListener() {\n    this._selectedShipUpdateListener &&\n      (this._selectedShipUpdateListener = null)\n  }\n\n  /**\n   * 获取区域船显示状态\n   */\n  getAreaShipShowStatus() {\n    return this._areaShipIsShow\n  }\n  /**\n   * 设置区域船显示状态\n   * @params isShow\tBoolean\t区域船是否可用\n   */\n  setAreaShipShowStatus(isShow: boolean) {\n    this._areaShipIsShow = isShow\n    this._drawShips()\n  }\n  /**\n   * 非选中船是否显示\n   *  非选中船是否显示，并执行重绘\n   * @params isShow\tboolean\t是否显示\n   * @params isRedrawShips\tboolean\t是否重绘区域船\n   */\n  setNoSelShipIsShow(isShow: boolean, isRedrawShips: boolean) {\n    this._noSelShipIsShow = isShow\n    isRedrawShips && this._drawShips()\n  }\n  /**\n   * 是否相应鼠标事件\n   * @params isEvent\tboolean\ttrue:响应，false：不响应；\n   */\n  setPointerEvents(isEvent: boolean) {\n    if (this._map) {\n      const panes = this._map.getPanes()\n      if (isEvent) {\n        if (hasIn(panes, 'canvasShipsPane')) {\n          panes.canvasShipsPane.style.pointerEvents = 'auto'\n        }\n      } else {\n        if (hasIn(panes, 'canvasShipsPane')) {\n          panes.canvasShipsPane.style.pointerEvents = 'none'\n        }\n      }\n    }\n  }\n  /**\n   * 设置选中船\n   * @params shipid\tObject\t船舶shipId字符串或{shipid:shipid}对象\n   */\n  setSelectedShip(shipid: any) {\n    if (!CanvasShipUtils.isEmpty(shipid)) {\n      if ('object' === CanvasShipUtils.getObjType(shipid))\n        this._map._selShipId = shipid\n      else {\n        this._map._selShipId = {}\n        const key = this._getKeyShipid_en(shipid)\n        this._map._selShipId[`${key}`] = shipid\n        const ship = this.getShipByShipid(shipid)\n        ship &&\n          this._selectedShipListener &&\n          setTimeout(() => {\n            this._selectedShipListener &&\n              this._selectedShipListener(this._callBackObjBuild(ship))\n          }, 50)\n      }\n      this._drawShips()\n    }\n  }\n  /**\n   * 获取选中船\n   */\n  getSelectedShip() {\n    return this._map._selShipId\n  }\n  /**\n   * 取消选中船\n   */\n  cancelSelectedShip() {\n    this._map._selShipId = {}\n    this._drawShips()\n  }\n\n  /**\n   * 设置船舶绘制图层层级\n   * @params zindex\tnumber\t层级\n   */\n  setZIndex(zindex = 90) {\n    if (this._map) {\n      const panes = this._map.getPanes()\n      if (hasIn(panes, 'divCanvasShipsPane')) {\n        panes.divCanvasShipsPane.style.zIndex = `${zindex}`\n      }\n    }\n  }\n  /**\n   * 获取船舶绘制图层层级\n   *  获取船舶绘制图层层级(如不存在返回null)\n   */\n  getZIndex() {\n    return this._map\n      ? this._map.getPanes().divCanvasShipsPane.style.zIndex\n      : null\n  }\n  /**\n   * 恢复默认船舶绘制图层层级\n   */\n  restoreZIndex() {\n    if (this._map) {\n      let isRestore = false\n      this._map.trackService &&\n        (isRestore = this._map.trackService.hasTrackIsShow())\n      if (!isRestore) {\n        this._map.getPanes().divCanvasShipsPane.style.zIndex = '250'\n        this._map_move_function()\n        this._drawShips()\n      }\n    }\n  }\n  setOffsetLastdyn(offsetLastdyn: number) {\n    this.options.offsetLastdyn = offsetLastdyn\n    return this.options.offsetLastdyn\n  }\n  // TODO: 网络请求\n  _requestAreaShips_v3() {\n    console.log('网络请求')\n  }\n  _requestDShip() {\n    console.log('_requestDShip')\n  }\n  _requestFleetShips_v3() {\n    console.log('_requestFleetShips_v3')\n  }\n  _requestShipByMmsi(mmis: string) {\n    console.log('_requestShipByMmsi', mmis)\n    return ['none'] as any\n  }\n  _requestSelectedShips() {\n    console.log('_requestSelectedShips')\n  }\n  _requestGreenShips() {\n    console.log('_requestGreenShips')\n  }\n  _getKeyShipid_en(shipId: string | number) {\n    return Number.parseInt(`${shipId}`) == shipId\n      ? `${shipId}_selShipId`\n      : shipId\n  }\n  _getKeyShipid_de(id: string) {\n    return `${id}`.replace('_selShipId', '')\n  }\n  /**\n   * 更新设置的监控船列表\n   * @params monitorShips\t\t监控船列表\n   * @params isAdd\t\t是否追加 默认不追加，清除原有设置\n   */\n  updateMonitorShips(monitorShips: CanvasShip[]) {\n    this._monitorShipsHash = {}\n    for (let i = 0; i < monitorShips.length; i++)\n      this._monitorShipsHash[monitorShips[i].mmsi] = monitorShips[i]\n    return this.getMonitorShips()\n  }\n  /**\n   * 获取设置的监控船舶列表\n   */\n  getMonitorShips() {\n    this.options.monitorShips = Object.keys(this._monitorShipsHash)\n    return this.options.monitorShips\n  }\n  _checkShipIsMonitor(ship: CanvasShip, isHash = false) {\n    const { mmsi, monitorOnline } = ship\n    return (\n      monitorOnline ||\n      (!!mmsi &&\n        mmsi.toString() in this._monitorShipsHash &&\n        (!isHash || this._monitorShipsHash[mmsi].online))\n    )\n  }\n  /**\n   * 添加特殊船舶（置顶显示）\n   */\n  addSpecialShips(specialShips: string | any[]) {\n    if (specialShips) {\n      const ships: CanvasShip[] = []\n      for (const ship of specialShips) {\n        ship.istop = true\n        ships.push(ship)\n        this._specialShips[`${ship.shipid}`] = ship\n      }\n      this.addShips(ships)\n    }\n  }\n  /**\n   * 根据MMSI删除指定特殊船\n   * @params ships\t\t特殊船舶MMSI\n   */\n  deleteSpecialShips(isClearCache = false, ships?: string | string[]) {\n    ships = ships || Object.keys(this._specialShips)\n    const deleteShipIds: string[] = []\n    for (const shipid of ships) {\n      let mmsi = ''\n      if (shipid in this._specialShips) {\n        mmsi = this._specialShips[shipid].mmsi\n        delete this._specialShips[shipid]\n        deleteShipIds.push(shipid)\n      }\n      const ship = this._grid_ships.getItemByPK(shipid)\n      if (mmsi) {\n        const key = this._DShips_key + mmsi\n        isEmpty(ship) ||\n          key in this._DShips ||\n          mmsi in this._fleetShips ||\n          (ship.istop = false)\n      }\n    }\n    isClearCache && deleteShipIds.length\n      ? this.deleteShipByShipID(deleteShipIds)\n      : this._drawShips()\n  }\n}\n\n// const ShipService = (\n//   map: MyMap,\n//   options?: CanvasShipServiceOptions\n// ) => {\n//   map.shipsService || (map.shipsService = new CanvasShipService(map, options))\n//   return map.shipsService\n// }\n\n// export default ShipService\nexport { CanvasShipService }\n"],"names":["N","f","Class","constructor","e","i","super","this","_isRightContentMenuOpen","_filterOptions","shipType","shipSog","shipCustomSog","shipNaviStatus","shipLength","shipHdg","shipCountry","validIMO","options","isAutoUpdateSrvtime","enableAreaShip","enableFleetShip","enableTracks","enableDShip","enableSelectedShip","requestCallback","getShip","getAreaShip","getDPlusShip","getFleetShip","dShipColor","topLabelZoom","generalLabelZoom","weixingLabelZoom","delayTime","offsetLastdyn","bounds","getAreaShipsCallBack","zoomLevel_base","labelLanguage","R","language","lableFont","lableTxtColorMapTypeDark","lableRotate","lableTxtColor","lableLineColor","lableLinefillColor","monitorShips","obliqueLineColor","shipSizeZoom","shipOptions","sizeZoom","lineColor","heightLineColor","tooltip_fields","areaShipsDataGridSize","drawBaseShipsGridZoom","drawBaseShipsGridMax","drawBaseShipsGridSize","drawBaseShipsGridMaxCount","isShowLableTime","isShowLabel","radarOptions","color","lineWidth","iconSize","openRightMenu","isUse","selectShip","netsondeOptions","show","maptype","labelImages","_timerOpen","_map_move_time_num","_canvas_mousedown","_moveendTimer","_labelImages","_map","_selShipId","_srvTime","Date","now","Util","extend","_layerGroup","featureGroup","addTo","_zoomLevel","getZoom","_areaShipIsShow","_noSelShipIsShow","_grid_ships","z","grid_size","_requestAreaShips","_requestAreaShipsLoading","_requestAreaShips_timer","_requestAreaShips_num","_fleetShips","_DShips","_specialShips","_DShips_key","_beidou_ships","_viewShips","_labels","_labels_time","_scode","_continue","_monitorShipsHash","_tooltip_txt_templater","name","cnname","mmsi","imo","callsign","sog","cog","hdg","draught","dest","lastdyn","navistatus","type","rot","lat","lng","seaareaid","_drawCount","_topShipsCount","_baseShipsCount","_baseShipsCount_chouxi","_clrState","_timer_area_num","resizeHTML","_getLabelImages","on","A","t","_map_move_function","_drawShips","_map_move_end_function","_delayTime","Math","max","_timerStart","h","clientWidth","clientHeight","getContainer","_size","Point","getPanes","divCanvasShipsPane","remove","n","DomUtil","create","overlayPane","style","zIndex","o","width","getSize","x","height","y","addEventListener","a","_mousemoveFunction","_closeTooltip","g","preventDefault","d","getShipByEvent","setSelectedShip","shipid","left","r","top","S","b","L","display","p","offsetWidth","m","offsetHeight","l","layerX","s","layerY","u","_","document","querySelector","_rightContentMenu","disableMap","closeRightMenu","c","mouseInArr","canvasShipsPane","_unselectedShipListener","setTimeout","enableMap","cancelSelectedShip","dragging","disable","touchZoom","scrollWheelZoom","enable","common","satellite","dplus","monitor","beidou","Promise","all","_requestAreaShips_v3","length","_drawRequestShips","then","window","requestIdleCallback","getMapTransform","_mapPane","getAttribute","Browser","ie","indexOf","substring","split","map","Number","parseInt","getPane","transform","getBoundingClientRect","requestAnimationFrame","trackService","hasTrackIsShow","setNoSelShipIsShow","cursor","datapower","clearTimeout","_mouseMoveTimer","_hoverShipId","_openTooltip","_tooltip","closeTooltip","_getMouseLatlng","_getTooltipHtml","C","openTooltip","direction","offset","opacity","getMousePos","containerPointToLatLng","_getTooltipData","replace","getTime","dataFormat","getDisValue","T","getNumber","getShipTypeCN","newtype","latFormatter","lngFormatter","removeLayer","_callBackObjBuild","_updateShips","getItemCount","updateDatas","getItemByPK","isEmpty","toString","source","custom_name","istop","group_name","remark","shiptype","tracks","abs","lastdyn_active","time","push","updtime","getShipByMmsi","includes","source_real","clearAllShips","getBounds","getSouthWest","getNorthEast","latLngBounds","LatLng","getShipByShipid","Object","keys","_getKeyShipid_de","forEach","offsetC","B","gcj_encrypt","outCN","lon","contains","getSplitLatLngBounds","getItemByBounds","drawShipsBeforeCallBack","entries","_getKeyShipid_en","E","latLng","arr_index","updateState","state","is_yh","isYUNZHENAndHAIJIAN","_isFilter","_isValidIMO","_drawShip","_grid_ships_view_filter","Map","limit","getGridKeyByLatLng","get","ship","reduce","M","v","set","w","find","Set","some","has","add","slice","isSelected","_drawLablesFn","_drawLables","_updateSrvTime","_drawShipsEnd","drawShipsEndCallBack","viewShips","count","viewShipLength","zoom","event","isNaN","getLatlng","assign","P","D","resetShipColorCallBack","call","mapType","q","bodyArea","head_x","head_y","latlngReal","pointCenterReal","pointCenterGPS","rotate","latlng","labelText","nameen","_drawLabel","getBoundingBoxArea","min","round","sqrt","txt_color","O","_getLabelImageInfo","_ship","k","calcLabel","symbol","sourceType","labelImage","txtColor","font","lineFillColor","drawLable","labelRotate","is_monitor","_checkShipIsMonitor","isDraw","imgTypes","imgWidth","imgSize","imgOffset","setShowLabel","timerFunction","_requestDShip","_requestFleetShips_v3","_requestSelectedShips","_requestGreenShips","_timer","splice","drawRequestShipsBeforeCallback","_selectedShipUpdateListener","_timerStop","test","getNewShipTypeCN","filter","Boolean","country","isCNShip","addShips","outOfChina","deleteShipByShipID","getObjType","concat","deleteByPK","removeAllShips","deleteAll","addFleetShips","deleteFleetShips","getItemByMMSI","deleteAllFleetShips","deleteAllAreaShips","_items","getContext","clearRect","save","locationShip","GPSEncryptByMapToLatLng","setView","_selectedShipListener","_requestShipByMmsi","setFilter","getFilter","addRightContextmenuListener","removeRightContextmenuListener","addSelectedListener","removeSelectedListener","addUnSelectedListener","removeUnSelectedListene","addSelectedShipUpdateListener","removeSelectedShipUpdateListener","getAreaShipShowStatus","setAreaShipShowStatus","setPointerEvents","I","pointerEvents","getSelectedShip","setZIndex","getZIndex","restoreZIndex","setOffsetLastdyn","updateMonitorShips","getMonitorShips","monitorOnline","online","addSpecialShips","deleteSpecialShips"],"mappings":"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"}