{"version":3,"file":"NavigationServiceImpl.mjs","sources":["../../../../../packages/sdk/plugins/NavigationServiceImpl.ts"],"sourcesContent":["import L, { type PointExpression } from 'leaflet'\nimport { throttle } from 'lodash-unified'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { ShipxyOptions } from '@map-sdk/sdk/config'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { canvasIconLayer } from '@map-sdk/sdk/plugins/canvasMarker'\n// import 'leaflet-canvas-marker'\nimport { resultDatas } from './NavigationData'\n\nclass CanvasNavigation {\n  mmsi = ''\n  lng = 0\n  lat = 0\n  lastdyn = 0\n  shiptype = 'navigation'\n  type = 0\n  name = ''\n  length = 0\n  width = 0\n  left = 0\n  trail = 0\n  offsetstatus = 0\n  atonstatus = 0\n  isvirtual = 0\n  serverTime = 0\n  shipid = 0\n\n  getLatlng() {\n    return new L.LatLng(this.lat, this.lng)\n  }\n}\n\n// 解决canvasLayer响应式的问题\nconst layer = {\n  markersLayer: null as any,\n}\n\nexport class NavigationServiceImpl {\n  private _map: L.Map\n  private _canvasNavigationsPane!: HTMLCanvasElement\n  private items: { [mmsi: string]: L.Marker }\n  private _selectedNavigation: any\n  private _showState: boolean\n  private requesting: any\n\n  private options: {\n    onClick?: (e: any) => void\n    onHover?: (e: any) => void\n\n    flyToZoom: number\n    bigIconZoom: number\n    iconScale: number\n    smallIconScale: number\n    isShow: boolean\n    isShowTooltip: boolean\n    isSelectedShowReal: boolean\n    methods?: any\n  } = {\n    flyToZoom: 10,\n    bigIconZoom: 6,\n    iconScale: 0.6,\n    smallIconScale: 1,\n    isShow: true,\n    isShowTooltip: true,\n    isSelectedShowReal: true,\n  }\n\n  constructor(map: L.Map, options?: any) {\n    this._map = map\n    L.Util.extend(this.options, options)\n    this._setupCanvas()\n    layer.markersLayer = canvasIconLayer({\n      pane: this._map.getPanes().divCanvasNavigationsPane,\n    }).addTo(this._map)\n    this._setupEventListeners()\n    this.items = {}\n    this._showState = this.options.isShow\n    this._selectedNavigation = null\n    this.requesting = null\n    if (this._showState) {\n      this.show()\n    }\n  }\n\n  // 特别注意 panes.overlayPane 如果都放在leaflet-pane leaflet-overlay-pane 中会存在不能同时选中的问题\n  private _setupCanvas(): void {\n    const panes = this._map.getPanes()\n    panes.canvasNavigationsPane && panes.canvasNavigationsPane.remove()\n    if (!panes.divCanvasNavigationsPane) {\n      panes.divCanvasNavigationsPane = L.DomUtil.create(\n        'div',\n        'div-canvas-navigations',\n        panes.mapPane // panes.overlayPane\n      )\n    }\n    if (!this._canvasNavigationsPane) {\n      this._canvasNavigationsPane = L.DomUtil.create(\n        'canvas',\n        'canvas-navigations',\n        panes.divCanvasNavigationsPane\n      )\n      this._canvasNavigationsPane.width = this._map.getSize().x\n      this._canvasNavigationsPane.height = this._map.getSize().y\n    }\n    panes.canvasNavigationsPane = this._canvasNavigationsPane\n  }\n\n  private _setupEventListeners(): void {\n    layer.markersLayer.addOnClickListener((e: any, data: any) => {\n      if (this.options.onClick) {\n        this.options.onClick(data)\n      }\n    })\n    layer.markersLayer.addOnHoverListener((e: any, data: any) => {\n      if (this.options.onHover) {\n        this.options.onHover(data)\n      }\n    })\n    this._map.on(\n      'moveend',\n      () => {\n        throttle(() => {\n          this._resetCanvas()\n          if (this._showState) {\n            setTimeout(() => {\n              this.show()\n              if (\n                this._selectedNavigation &&\n                !this.getNavigationByMMSI(this._selectedNavigation.mmsi)\n              ) {\n                this.addMarker(this._selectedNavigation)\n              }\n            }, 100)\n          } else {\n            if (this._selectedNavigation) {\n              this.addMarker(this._selectedNavigation)\n            }\n          }\n        }, 1000)()\n      },\n      this\n    )\n  }\n\n  /**\n   * 添加航标\n   *  添加航标、按MMSI自动覆盖\n   * @params\n   */\n  addMarker(data: CanvasNavigation) {\n    this.items[data.mmsi] && this.removeMarkerByMMSI(data.mmsi)\n    const iconOptions = this._getIconOptions(data)\n    const marker = L.marker(\n      CanvasShipUtils.GPSEncryptByMapToLatLng(\n        L.latLng(data.lat, data.lng),\n        this._map\n      ),\n      {\n        icon: L.icon(iconOptions),\n        data,\n      } as any\n    )\n    if (this.options.isShowTooltip) {\n      const language = 'cn' == 'cn'\n      let html = ''\n      html +=\n        '<div style=\"background: #fff;padding:2px;border-radius:3px;line-height:18px;width:fit-content;font-size:12px;min-width:200px;\">'\n      html += `<p style=\"font-size:12px\"><span style=\"color:#666\">\n        航标类型：</span> ${\n          language\n            ? this.getNavigationType(data.type)\n            : this.getNavigationTypeEn(data.type)\n        }</p>`\n      html += `<p style=\"font-size:12px\"><span style=\"color:#666\">\n        航标名称：</span> ${data.name}</p>`\n      html += `<p style=\"font-size:12px\"><span style=\"color:#666\">\n        航标分类：</span> ${0 == data.isvirtual ? '真实航标' : '虚拟航标'}</p>`\n      html += `<p style=\"font-size:12px\"><span style=\"color:#666\">\n        更新时间：</span> ${CommUtils.dataFormat(data.lastdyn * 1000)}</p>`\n      html += '</div>'\n      marker.bindTooltip(html, {\n        offset: [10, 10],\n        direction: 'right',\n      })\n    }\n    layer.markersLayer.addMarker(marker)\n    this.items[data.mmsi] = marker\n    this._selectedNavigation &&\n      this._selectedNavigation.mmsi == data.mmsi &&\n      this._drawSelectedPosition(this._selectedNavigation)\n  }\n  /**\n   * 添加多个航标\n   *  添加航标、按MMSI自动覆盖\n   * @params\n   */\n  addMarkers(data: CanvasNavigation[]) {\n    let selectedNavigation = null\n    for (const datum of data) {\n      if (\n        this._selectedNavigation &&\n        this._selectedNavigation.mmsi == datum.mmsi\n      ) {\n        selectedNavigation = datum\n      } else {\n        this.addMarker(datum)\n      }\n    }\n    selectedNavigation && this.addMarker(selectedNavigation)\n  }\n  _requestNavigationDatas(cb: { (resData: any): void; (arg0: any): any }) {\n    if (this.requesting) {\n      clearTimeout(this.requesting)\n    }\n    this.requesting = setTimeout(() => {\n      let url = ShipxyOptions.shipDataServer.getNavigationUrl\n      const areas = []\n      const bounds = this._map.getBounds()\n      const { lng: sLng, lat: sLat } = bounds.getSouthWest()\n      const { lng: NLng, lat: NLat } = bounds.getNorthEast()\n      areas.push(1000000 * sLng, 1000000 * sLat, 1000000 * NLng, 1000000 * NLat)\n      url = url.replace('{level}', '2').replace('{area}', areas.join())\n      console.log('TODO: 网络请求', url)\n      const done = (result: any) => cb && cb(result)\n      this.options.methods && this.options.methods(areas, done)\n      !this.options.methods && done(resultDatas)\n    }, 100)\n  }\n\n  _scaleIcon(iconOptions: L.IconOptions, scale: number): void {\n    iconOptions.iconSize![0] *= scale\n    iconOptions.iconSize![1] *= scale\n    iconOptions.iconAnchor![0] *= scale\n    iconOptions.iconAnchor![1] *= scale\n  }\n  _getIconOptions(data: {\n    type: number\n    isvirtual: any\n    mmsi: any\n  }): L.IconOptions {\n    const iconOptions = this._getIconOptionsReal(data.type, data.isvirtual)\n    const isSmallIcon =\n      this._map.getZoom() < this.options.bigIconZoom &&\n      (this.options.isSelectedShowReal && this._selectedNavigation\n        ? this._selectedNavigation.mmsi !== data.mmsi\n        : true)\n\n    if (isSmallIcon) {\n      iconOptions.iconUrl = `${ShipxyOptions.data_img.navigarion.navi0}`\n      iconOptions.iconSize = [12, 12]\n      iconOptions.iconAnchor = [6, 6]\n      this._scaleIcon(iconOptions, this.options.smallIconScale)\n    } else {\n      this._scaleIcon(iconOptions, this.options.iconScale)\n    }\n\n    return iconOptions\n  }\n  _getIconOptionsReal(type: number, isvirtual: any): L.IconOptions {\n    let typeKey = null\n    switch (type) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n      case 8:\n      case 31:\n      default:\n        typeKey = 1\n        break\n      case 9:\n      case 20:\n        typeKey = 3\n        break\n      case 10:\n      case 21:\n        typeKey = 5\n        break\n      case 11:\n      case 22:\n        typeKey = 7\n        break\n      case 12:\n      case 23:\n        typeKey = 9\n        break\n      case 13:\n      case 15:\n      case 24:\n      case 26:\n        typeKey = 11\n        break\n      case 14:\n      case 16:\n      case 25:\n      case 27:\n        typeKey = 13\n        break\n      case 17:\n      case 28:\n        typeKey = 15\n        break\n      case 18:\n      case 29:\n        typeKey = 17\n        break\n      case 19:\n      case 30:\n        typeKey = 19\n    }\n\n    let iconOPtions = {\n      iconUrl:\n        ShipxyOptions.data_img.navigarion[\n          `navi${isvirtual ? typeKey + 1 : typeKey}`\n        ],\n      iconSize: [22, 22] as PointExpression,\n      iconAnchor: [11, 11] as PointExpression,\n    }\n    switch (typeKey) {\n      case 1:\n        iconOPtions = {\n          ...iconOPtions,\n          iconSize: [22, 22],\n          iconAnchor: [11, 11],\n        }\n        break\n      case 3:\n      case 5:\n      case 7:\n      case 9:\n      case 15:\n        iconOPtions = {\n          ...iconOPtions,\n          iconSize: [22, 36],\n          iconAnchor: [11, 25],\n        }\n        break\n      case 11:\n      case 13:\n      case 17:\n      case 19:\n        iconOPtions = {\n          ...iconOPtions,\n          iconSize: [22, 30],\n          iconAnchor: [11, 19],\n        }\n    }\n    return iconOPtions\n  }\n  _removeMarker(markerItem: L.Marker<any>, isRemove: boolean) {\n    if (markerItem) {\n      layer.markersLayer.removeMarker(markerItem, isRemove)\n      delete this.items[(markerItem.options as any).data.mmsi]\n    }\n  }\n  /**\n   * 擦除所有航标\n   *  擦除所有航标（内存对象未删除）\n   */\n  clearMarker() {\n    layer.markersLayer.clearLayers()\n  }\n\n  /**\n   * 移除航标\n   * @params mmsi\tString\t航标标识MMSI\n   * @params redraw\tBoolean\t是否刷新视图\n   */\n  removeMarkerByMMSI(mmsi: string | number) {\n    this.items[mmsi] && this._removeMarker(this.items[mmsi], true)\n  }\n  /**\n   * 移除所有航标\n   */\n  removeAllMarker() {\n    this.clearMarker()\n    this.items = {}\n  }\n  /**\n   * 重绘所有航标\n   */\n  recoveryMarker() {\n    this.clearMarker()\n    let item = null\n    for (const key in this.items) {\n      if (this._selectedNavigation && this._selectedNavigation.mmsi == key) {\n        item = this.items[key]\n      } else {\n        layer.markersLayer.addMarker(this.items[key])\n      }\n    }\n    item && layer.markersLayer.addMarker(item)\n  }\n  /**\n   * 航标图层重绘\n   */\n  redraw() {\n    layer.markersLayer.redraw()\n  }\n  /**\n   * 通过MMSI定位航标\n   * @params mmsi\tString\t航标标识MMSI\n   */\n  locationNavigationByMMSI(mmsi: any, isRequest: boolean | undefined) {\n    const shipNavigation = this.getNavigationByMMSI(mmsi, isRequest)\n    this.locationNavigation(shipNavigation)\n    return shipNavigation\n  }\n  /**\n   * 定位航标对象\n   * @params navigation\t\t航标对象\n   */\n  locationNavigation(navigation: { lat: number; lng: number }) {\n    if (navigation) {\n      this._selectedNavigation = navigation\n      this._map.flyTo(\n        L.latLng(navigation.lat, navigation.lng),\n        this.options.flyToZoom,\n        {\n          animate: false,\n        }\n      )\n      this._showState || this.addMarker(this._selectedNavigation)\n    }\n  }\n  /**\n   * 设置选中\n   * @params mmsi\tString\t航标标识MMSI\n   */\n  setSelectedNavigation(mmsi: any) {\n    mmsi && (this._selectedNavigation = this.getNavigationByMMSI(mmsi, true))\n    this._selectedNavigation && this.addMarker(this._selectedNavigation)\n  }\n  /**\n   * 取消选中\n   */\n  cancelSelected() {\n    const selectedNavigation = this._selectedNavigation\n    if (selectedNavigation) {\n      this._selectedNavigation = null\n      this._clearSelectedPosition()\n      this._showState ? this.addMarker(selectedNavigation) : this.clearMarker()\n    }\n  }\n  _drawSelectedPosition(ship: { mmsi: string | number }) {\n    this._clearSelectedPosition()\n    const canvas = this._canvasNavigationsPane.getContext(\n      '2d'\n    ) as CanvasRenderingContext2D\n    const item = this.items[ship.mmsi]\n    const point = this._map.latLngToContainerPoint(item.getLatLng())\n    const iconSize = item.options.icon!.options.iconSize\n    const iconAnchor = item.options.icon!.options.iconAnchor\n    const iconScale1 = 8 * this.options.iconScale\n    const iconScale2 = 6 * this.options.iconScale\n    const x1 = point.x - iconAnchor![0]\n    const y1 = point.y - iconAnchor![1]\n    const x2 = point.x + (iconSize![0] - iconAnchor![0])\n    const y2 = point.y + (iconSize![1] - iconAnchor![1])\n    canvas.save()\n    canvas.beginPath()\n    canvas.moveTo(x1 - iconScale1, y1 + iconScale1 - iconScale2)\n    canvas.lineTo(x1 - iconScale1, y1 - iconScale1)\n    canvas.moveTo(x1 - iconScale1, y1 - iconScale1)\n    canvas.lineTo(x1 + iconScale1 - iconScale2, y1 - iconScale1)\n    canvas.moveTo(x2 - iconScale1 + iconScale2, y1 - iconScale1)\n    canvas.lineTo(x2 + iconScale1, y1 - iconScale1)\n    canvas.moveTo(x2 + iconScale1, y1 - iconScale1)\n    canvas.lineTo(x2 + iconScale1, y1 + iconScale1 - iconScale2)\n    canvas.moveTo(x2 + iconScale1, y2 - iconScale1 + iconScale2)\n    canvas.lineTo(x2 + iconScale1, y2 + iconScale1)\n    canvas.moveTo(x2 + iconScale1, y2 + iconScale1)\n    canvas.lineTo(x2 - iconScale1 + iconScale2, y2 + iconScale1)\n    canvas.moveTo(x1 + iconScale1 - iconScale2, y2 + iconScale1)\n    canvas.lineTo(x1 - iconScale1, y2 + iconScale1)\n    canvas.moveTo(x1 - iconScale1, y2 + iconScale1)\n    canvas.lineTo(x1 - iconScale1, y2 - iconScale1 + iconScale2)\n    canvas.closePath()\n    canvas.strokeStyle = 'red'\n    canvas.lineWidth = 1\n    canvas.lineJoin = 'round'\n    canvas.stroke()\n    canvas.restore()\n  }\n  _clearSelectedPosition() {\n    const { width, height } = this._canvasNavigationsPane\n    const canvas = this._canvasNavigationsPane.getContext(\n      '2d'\n    ) as CanvasRenderingContext2D\n    canvas.clearRect(0, 0, width, height)\n    canvas.save()\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\n  _resetCanvas() {\n    const map = this._map\n    this._canvasNavigationsPane.width = map.getSize().x\n    this._canvasNavigationsPane.height = map.getSize().y\n    const initialTransformValue = this.getMapTransform(map)\n    this._canvasNavigationsPane.style.transform = initialTransformValue\n    this._map.getPanes().canvasNavigationsPane = this._canvasNavigationsPane\n\n    // 假设在应用初始transform之前保存了元素的初始位置\n    const initialRect = this._canvasNavigationsPane.getBoundingClientRect()\n    // 2. 使用requestAnimationFrame在下一帧渲染时检查并调整transform值\n    requestAnimationFrame(() => {\n      // 检查应用初始transform值后是否存在位移\n      const rectAfterInitialTransform =\n        this._canvasNavigationsPane.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        this._canvasNavigationsPane.style.transform = adjustedTransform\n      }\n    })\n  }\n  /**\n   * 获取航标信息\n   * @params mmsi\t\t航标标识MMSI\n   * @params isRequest\t\t是否请求服务器数据\n   */\n  getNavigationByMMSI(mmsi: string, isRequest = false) {\n    let shipNavigation = null\n    if (this.items[mmsi]) {\n      shipNavigation = (this.items[mmsi].options as any).data\n    } else {\n      if (isRequest) {\n        // $.ajax({\n        //   url: ShipxyOptions.shipDataServer.getNavigationUrlShipxy.replace(\n        //     '{0}',\n        //     mmsi\n        //   ),\n        //   type: 'get',\n        //   async: false,\n        //   dataType: 'json',\n        //   success(resData) {\n        //     'string' == typeof resData && (resData = JSON.parse(resData))\n        //     if (0 == resData.status && resData.data.length > 0) {\n        //       const dataItem = resData.data[0]\n        //       const ship = new CanvasNavigation()\n        //       ship.mmsi = dataItem.mmsi\n        //       ship.lng = dataItem.lon / 1000000\n        //       ship.lat = dataItem.lat / 1000000\n        //       ship.lastdyn = dataItem.lasttime\n        //       ship.type = dataItem.atontype\n        //       ship.shiptype = 'navigation'\n        //       ship.name = dataItem.atonname\n        //       ship.length = dataItem.length / 10\n        //       ship.width = dataItem.width / 10\n        //       ship.left = dataItem.left / 10\n        //       ship.trail = dataItem.trail / 10\n        //       ship.offsetstatus = dataItem.offsetstatus\n        //       ship.atonstatus = dataItem.atonstatus\n        //       ship.isvirtual = dataItem.isvirtual\n        //       shipNavigation = ship\n        //     } else {\n        //       shipNavigation = null\n        //     }\n        //   },\n        //   error() {\n        //     console.log('获取单航标信息失败')\n        //     shipNavigation = null\n        //   },\n        // })\n      } else {\n        shipNavigation = this.items[mmsi] || null\n      }\n    }\n    return shipNavigation\n  }\n  /**\n   * 航标图层显示\n   */\n  show() {\n    this._requestNavigationDatas((resData: any) => {\n      this.removeAllMarker()\n      this.addMarkers(resData)\n    })\n    this._showState = true\n  }\n\n  /**\n   * 隐藏图层\n   */\n  hide() {\n    this.removeAllMarker()\n    this._showState = false\n    this._selectedNavigation && this.cancelSelected()\n  }\n  /**\n   * 根据航标类型代码获取航标类型\n   * @params typeCode\t\t航标类型代码\n   */\n  getNavigationType(typeCode: string | number) {\n    const typeList = [\n      '未知',\n      '参考点',\n      '雷达应答器',\n      '近海固定建筑物，如石油平台、风力发电厂',\n      '应急沉船示位标',\n      '全向灯桩',\n      '扇形光弧灯桩',\n      '前引导灯桩',\n      '后引导灯桩',\n      '灯桩和立标（北方位）',\n      '灯桩和立标（东方位）',\n      '灯桩和立标（南方位）',\n      '灯桩和立标（西方位）',\n      '灯桩和立标（左侧标）',\n      '灯桩和立标（右侧标）',\n      '灯桩和立标（推荐航道左侧标）',\n      '灯桩和立标（推荐航道右侧标）',\n      '灯桩和立标（孤立危险物标志）',\n      '灯桩和立标（安全水域标志）',\n      '灯桩和立标（专用标志）',\n      '北方位标',\n      '东方位标',\n      '南方位标',\n      '西方位标',\n      '左侧标',\n      '右侧标',\n      '推荐航道左侧标',\n      '推荐航道右侧标',\n      '孤立危险物标志',\n      '安全水域标志',\n      '专用标志',\n      '灯塔/大型助航浮标/钻探平台',\n    ]\n    return typeList[typeCode] || typeList[0]\n  }\n  /**\n   * 根据航标类型代码获取航标类型\n   * @params typeCode\t\t航标类型代码\n   */\n  getNavigationTypeEn(typeCode: string | number) {\n    const typeList = [\n      'Unknown',\n      'Reference point',\n      'Radar transponder',\n      'Offshore fixed buildings, such as oil platforms and wind power plants',\n      'Emergency sunken position indicator',\n      'Omnidirectional beacon',\n      'Fan light arc lamp post',\n      'Front guide light post',\n      'Rear guide light post',\n      'Light posts and signs (North)',\n      'Light posts and signs (Eastern)',\n      'Light posts and signs (South)',\n      'Light posts and signs (Western)',\n      'Light post and vertical sign (Left)',\n      'Light posts and vertical signs (Right)',\n      'Light posts and vertical signs (recommended channel left sign)',\n      'Light posts and signposts (right side of recommended channel)',\n      'Light posts and vertical signs (isolated hazard signs)',\n      'Light posts and signs (signs of safe waters)',\n      'Light posts and signs (special signs)',\n      'Northern beacon',\n      'Oriental beacon',\n      'Southern beacon',\n      'Western landmark',\n      'Left label',\n      'Right label',\n      'Left marker of recommended channel',\n      'Right marker of recommended channel',\n      'Isolated dangerous goods sign',\n      'Safe water area sign',\n      'Special signs',\n      'Lighthouse/large navigation buoy/drilling platform',\n    ]\n    return typeList[typeCode] || typeList[0]\n  }\n}\n"],"names":["g","markersLayer","NavigationServiceImpl","constructor","e","t","this","options","flyToZoom","bigIconZoom","iconScale","smallIconScale","isShow","isShowTooltip","isSelectedShowReal","_map","h","Util","extend","_setupCanvas","f","pane","getPanes","divCanvasNavigationsPane","addTo","_setupEventListeners","items","_showState","_selectedNavigation","requesting","show","canvasNavigationsPane","remove","DomUtil","create","mapPane","_canvasNavigationsPane","width","getSize","x","height","y","addOnClickListener","onClick","addOnHoverListener","onHover","on","_resetCanvas","setTimeout","getNavigationByMMSI","mmsi","addMarker","removeMarkerByMMSI","_getIconOptions","i","marker","u","GPSEncryptByMapToLatLng","latLng","lat","lng","icon","data","n","getNavigationType","type","name","isvirtual","_","dataFormat","lastdyn","bindTooltip","offset","direction","_drawSelectedPosition","addMarkers","_requestNavigationDatas","clearTimeout","p","shipDataServer","getNavigationUrl","s","getBounds","l","getSouthWest","a","r","getNorthEast","push","replace","join","o","c","methods","N","_scaleIcon","iconSize","iconAnchor","_getIconOptionsReal","getZoom","iconUrl","data_img","navigarion","navi0","_removeMarker","removeMarker","clearMarker","clearLayers","removeAllMarker","recoveryMarker","redraw","locationNavigationByMMSI","locationNavigation","flyTo","animate","setSelectedNavigation","cancelSelected","_clearSelectedPosition","getContext","latLngToContainerPoint","getLatLng","m","v","save","beginPath","moveTo","lineTo","closePath","strokeStyle","lineWidth","lineJoin","stroke","restore","clearRect","getMapTransform","_mapPane","getAttribute","Browser","ie","indexOf","substring","length","split","map","Number","parseInt","style","transform","getBoundingClientRect","requestAnimationFrame","hide","getNavigationTypeEn"],"mappings":"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"}