{"version":3,"file":"CanvasShipSJService.mjs","sources":["../../../../packages/sdk/CanvasShipSJService.ts"],"sourcesContent":["import * as L from 'leaflet'\n// import 'leaflet.vectorgrid'\nimport { CanvasShipUtils } from './utils/CanvasShipUtils'\nimport { CommUtils } from './utils/CommUtils' // 添加缺失的工具类导入\nimport type { BoundsExpression, Point, PointExpression } from 'leaflet'\n// 1. 定义选项接口\ninterface CanvasShipLayerOptions extends L.GridLayerOptions {\n  iconUrl: string\n  // 添加其他自定义选项\n  shipSize?: number\n  color?: string\n}\n\nconst CanvasShipLayer = L.GridLayer.extend({\n  version: '1.0.202411041506',\n  options: {\n    laneOptions: {\n      drawType: 'solid',\n      radius: 1,\n      enableMousemove: true,\n      enableLaneClick: true,\n      colorByType: {\n        1: '#ff0000',\n        2: '#00ff00',\n        3: '#0000ff',\n        4: '#ffff00',\n        5: '#ff00ff',\n        6: '#00ffff',\n        7: '#ff0000',\n        8: '#00ff00',\n        9: '#0000ff',\n      },\n      colorByDefault: 'yellow',\n      shipDetailURL: undefined,\n      isShowTileBox: true,\n      isDrawBoundPoint: false,\n      fieldMap: {\n        name: 'name',\n        mmsi: 'mmsi',\n        type: 't',\n        sog: 's',\n        hdg: 'h',\n        cog: 'c',\n        naviStatus: 'n',\n        utc: 'u',\n        key: 'k',\n      },\n    },\n    wmsParams: undefined,\n    onLoad: undefined,\n  },\n  initialize(url: string, options?: CanvasShipLayerOptions) {\n    this.setOptions(url, options)\n    this.loadVectorTileDependencies()\n    const tooltip = L.tooltip({\n      direction: 'top',\n      opacity: 0.8,\n      className: 'leaflet-gcs-tooltip',\n    })\n    this._tooltip = tooltip\n    const iconUrl =\n      options?.iconUrl ||\n      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAACXBIWXMAAAsSAAALEgHS3X78AAAApklEQVQ4jWP8z8DgwADB2MAChv//H2CIMzIqMDAwJODQ84AFamABAwPDBSwKNuDQKIDDIQYgc1ignAsM///jci0m+P//AlZDGRkPgCgmog0iAYwaSn0ASqcK4CQCiVHKACMjKEkxMP7//39oeH/oGEqjiGJgaADnY1LyPm5DR/M+jQyFFdIGsEBGAwVYUwUklidgUQ8v+bEZBgMf8Ihj03eAgYHhAQAxnSv3UtZ4ZQAAAABJRU5ErkJggg=='\n    const icon = L.icon({\n      iconUrl,\n      iconSize: [21, 21],\n      iconAnchor: [10, 10],\n    })\n    this._selector = L.marker([0, 0], { icon })\n    this._abortController_shipDetail = undefined\n    this._setTimeout_shipDetail = undefined\n  },\n  getVersion() {\n    return this.version\n  },\n  setOptions(url: string | null, options: { laneOptions: undefined } | null) {\n    if ((url && url !== '' && (this._url = url), options)) {\n      const optionsCopy = {\n        ...options,\n      }\n      const laneOptions = options.laneOptions\n      delete optionsCopy.laneOptions\n      L.Util.setOptions(this, optionsCopy)\n      options.laneOptions &&\n        (this.options.laneOptions = L.extend(\n          this.options.laneOptions,\n          laneOptions\n        ))\n    }\n    this._map && this.redraw()\n    return this.options\n  },\n  createTile(coords: any, done: any) {\n    const canvas = document.createElement('canvas')\n    const tileSize = this.getTileSize()\n    canvas.width = tileSize.x\n    canvas.height = tileSize.y\n    const context = canvas.getContext('2d')\n    return this.loadTileData(coords, context, done, canvas), canvas\n  },\n  onAdd(map: any) {\n    window.L.GridLayer.prototype.onAdd.call(this, map)\n    this.on('load', this._onLoaded, this)\n    this.on('tileload', this._onTileLoaded, this)\n    this.on('tileunload', this._onTileUnload, this)\n    map.on('zoomstart', this._onZoomLevelChange, this)\n    map.on('baselayerchange', this._onBaselayerchange, this)\n    this.options.laneOptions &&\n      this.options.laneOptions.enableMousemove === true &&\n      map.on('mousemove', this._onMouseMove, this)\n    this.options.laneOptions &&\n      this.options.laneOptions.enableLaneClick === true &&\n      map.on('click', this._onMapClick, this)\n  },\n  onRemove(map: any) {\n    this._tooltip.remove()\n    this._selector.remove()\n    this._setTimeout_shipDetail &&\n      (clearTimeout(this._setTimeout_shipDetail),\n      (this._setTimeout_shipDetail = null))\n    this._abortController_shipDetail &&\n      (this._abortController_shipDetail.abort(),\n      (this._abortController_shipDetail = null))\n    L.GridLayer.prototype.onRemove.call(this, map)\n    this.off('tileload', this._onTileLoaded, this)\n    map.off('mousemove', this._onMouseMove, this)\n    map.off('zoomstart', this._onZoomLevelChange, this)\n    map.off('baselayerchange', this._onBaselayerchange, this)\n    map.off('click', this._onMapClick, this)\n  },\n  _abortLoading() {\n    for (const tileKey in this._tiles) {\n      if (this._tiles[tileKey].coords.z !== this._tileZoom) {\n        const tileElement = this._tiles[tileKey].el\n        if (!tileElement.dataLoaded) {\n          tileElement.abortController.abort()\n          L.DomUtil.remove(tileElement)\n          delete this._tiles[tileKey]\n        }\n      }\n    }\n  },\n  _onMouseMove(event: any) {\n    const featureInfo = this._findFeature(event)\n    if (featureInfo && featureInfo.feature) {\n      this.selectorShip(featureInfo.feature, featureInfo.center)\n      this.openTooltip(featureInfo.feature, featureInfo.center)\n    } else {\n      this._map.getContainer().style.cursor = 'default'\n      this._tooltip.remove()\n      this._selector.remove()\n    }\n  },\n  _onMapClick(event: any) {\n    const featureInfo = this._findFeature(event),\n      feature = featureInfo ? featureInfo.feature : null,\n      center = featureInfo ? featureInfo.center : null\n    this.getShipDetail(feature, (featureDetail: any) => {\n      this.fire('lane-click', {\n        feature: featureDetail,\n        center,\n      })\n    })\n  },\n  _onZoomLevelChange(event: any) {\n    // Placeholder implementation for zoom level change\n    console.log('Zoom level changed:', event)\n  },\n  _onBaselayerchange() {\n    this.redraw()\n  },\n  _onTileLoaded(event: {\n    tile: { points: any; bounds_points: any[] }\n    coords: { scaleBy: (arg0: any) => any; z: any }\n  }) {\n    const points = event.tile.points\n    if (points && points) {\n      const tileSize = this.getTileSize()\n      const tileBounds = event.coords.scaleBy(tileSize)\n      const bounds = L.bounds([\n        [tileBounds.x, tileBounds.y],\n        [tileBounds.x + tileSize.x, tileBounds.y + tileSize.y],\n      ])\n      points.forEach(\n        (point: {\n          geometry: any[][]\n          latlng: any\n          point: Point\n          isBoundPoint?: boolean\n        }) => {\n          const geometry = point.geometry[0][0]\n          const x = geometry.x / 10 + tileBounds.x\n          const y = geometry.y / 10 + tileBounds.y\n          const pointObj = L.point(x, y)\n          const latLng = this._map.unproject(pointObj, event.coords.z)\n          point.latlng = latLng\n          point.point = pointObj\n          if (this.options.laneOptions.isDrawBoundPoint === true) {\n            const boundBox = L.bounds(\n              [pointObj.x - 8, pointObj.y - 8],\n              [pointObj.x + 8, pointObj.y + 8]\n            )\n            if (bounds.contains(boundBox)) {\n              const boundPoint = {\n                ...point,\n              }\n              boundPoint.isBoundPoint = true\n              event.tile.bounds_points.push(boundPoint)\n            }\n          }\n        }\n      )\n    }\n  },\n\n  _onTileUnload(event: { tile: any }) {\n    const tile = event.tile\n    if (tile && tile && tile.abortController) {\n      tile.abortController?.abort()\n      tile.abortController = null\n    }\n  },\n  _onLoaded(event: any) {\n    if (this.options.laneOptions.isDrawBoundPoint) {\n      this._drawAllBounds()\n    }\n    if (this.options.onLoad) {\n      this.options.onLoad(event)\n    }\n  },\n  getBBOXByCoords(coords: any) {\n    const nwSe = this._tileCoordsToNwSe(coords)\n    const crs = this._map.options.crs\n    const bounds = L.bounds(crs.project(nwSe[0]), crs.project(nwSe[1]))\n    const min = bounds.min\n    const max = bounds.max\n    return (\n      Number.parseFloat(this.options.wmsParams.version) >= 1.3 &&\n      'EPSG:4326' === crs.code\n        ? [min?.y ?? 0, min?.x ?? 0, max?.y ?? 0, max?.x ?? 0]\n        : [min?.x ?? 0, min?.y ?? 0, max?.x, max?.y]\n    ).join(',')\n  },\n  getTileUrl(coords: { x: any; y: any; z: any }) {\n    const crsCode = this._map.options.crs.code\n    let url = this._url.replaceAll('{srs}', crsCode)\n    if (this.options.wmsParams) {\n      const bbox = this.getBBOXByCoords(coords)\n      url = url.replaceAll('{bbox}', bbox)\n    } else {\n      url = url.replaceAll('{x}', coords.x)\n      url = url.replaceAll('{y}', coords.y)\n      url = url.replaceAll('{z}', coords.z)\n    }\n    return url\n  },\n  loadVectorTileDependencies() {\n    // 检查是否已加载 PBF 和 VectorTile\n    if ((window as any).Pbf && (window as any).VectorTile) {\n      return {\n        Pbf: (window as any).Pbf,\n        VectorTile: (window as any).VectorTile,\n      }\n    }\n\n    // 创建一个 Promise 来等待脚本加载完成\n    return new Promise((resolve, reject) => {\n      // 加载 PBF 库\n      const pbfScript = document.createElement('script')\n      pbfScript.src =\n        'https://unpkg.com/Leaflet.VectorGrid@1.3.0/dist/Leaflet.VectorGrid.min.js' // 使用 CDN\n      pbfScript.onload = () => {\n        resolve({\n          Pbf: (window as any).Pbf,\n          VectorTile: (window as any).VectorTile,\n        })\n      }\n      pbfScript.onerror = reject\n      document.head.appendChild(pbfScript)\n    })\n  },\n  loadTileData(\n    coords: { scaleBy: (arg0: any) => any },\n    context: any,\n    done: (arg0: null, arg1: any) => void,\n    canvas: {\n      abortController: AbortController | null\n      dataLoaded: boolean\n      points: any[]\n      bounds_points: never[]\n    }\n  ) {\n    const url = this.getTileUrl(coords)\n    if (canvas.abortController) {\n      canvas.abortController.abort()\n      canvas.abortController = null\n    }\n    canvas.abortController = new AbortController()\n    const tileSize = coords.scaleBy(this.getTileSize())\n    if (this.options.laneOptions.isShowTileBox) {\n      this.drawTileBox(context, coords)\n    }\n\n    this.loadArrayBuffer(url, canvas.abortController.signal)\n      .then((arrayBuffer: any) => {\n        const pbf = new (window as any).Pbf(arrayBuffer)\n        const vectorTile = new (window as any).VectorTile(pbf)\n        canvas.dataLoaded = false\n        canvas.points = []\n        canvas.bounds_points = []\n        for (const layerName in vectorTile.layers) {\n          const layer = vectorTile.layers[layerName]\n          const features = []\n          for (let i = 0; i < layer.length; i++) {\n            const feature = layer.feature(i)\n            feature.geometry = feature.loadGeometry()\n            let sog = this.getFeatureProperty(feature, 'sog')\n            let cog = this.getFeatureProperty(feature, 'cog')\n            let hdg = this.getFeatureProperty(feature, 'hdg')\n            if (hdg > 1000) {\n              hdg = CommUtils.getNumberLEValue(hdg, 35900, 100, 1)\n              hdg = CanvasShipUtils.xTo360(hdg)\n            }\n            if (cog > 1000) {\n              cog = CommUtils.getNumberLEValue(cog, 35990, 100, 1)\n              cog = CanvasShipUtils.xTo360(cog)\n            }\n            if (sog > 100) {\n              sog = CommUtils.getNumberLEValue(sog, 52576, 514, 1)\n            }\n            feature.properties[this.options.laneOptions.fieldMap.hdg] = hdg\n            feature.properties[this.options.laneOptions.fieldMap.cog] = cog\n            feature.properties[this.options.laneOptions.fieldMap.sog] = sog\n            this.drawFeature(tileSize, context, feature)\n            if (feature.type === 1) {\n              canvas.points.push(feature)\n            }\n            features.push(feature)\n          }\n          layer.features = features\n        }\n        done(null, canvas)\n      })\n      .catch((error: any) => {\n        done(error, canvas)\n      })\n  },\n  openTooltip(feature: any, point: any) {\n    this.getShipDetail(feature, (featureDetail: any) => {\n      this.showTooltip(featureDetail, point)\n    })\n  },\n  getShipDetail(\n    feature: { properties: any },\n    callback: ((arg0: any) => void) | null\n  ) {\n    const mmsi = this.getFeatureProperty(feature, 'mmsi')\n    if (\n      mmsi === null ||\n      mmsi === '' ||\n      this.options.laneOptions.shipDetailURL === null ||\n      this.options.laneOptions.shipDetailURL === ''\n    ) {\n      if (callback) {\n        callback(feature)\n      }\n    } else {\n      if (this._setTimeout_shipDetail) {\n        clearTimeout(this._setTimeout_shipDetail)\n        this._setTimeout_shipDetail = null\n      }\n      this._setTimeout_shipDetail = setTimeout(() => {\n        if (this._abortController_shipDetail) {\n          this._abortController_shipDetail.abort()\n          this._abortController_shipDetail = null\n        }\n        this._abortController_shipDetail = new AbortController()\n        let url = this.options.laneOptions.shipDetailURL\n        url = url.replaceAll('{k}', this.getFeatureProperty(feature, 'key'))\n        this.loadJson(url, this._abortController_shipDetail.signal)\n          .then((data: any) => {\n            feature.properties = {\n              ...feature.properties,\n              ...data,\n            }\n            if (callback) {\n              callback(feature)\n            }\n          })\n          .catch((error: any) => {\n            console.error('Error parsing JSON:', error)\n            if (callback) {\n              callback(feature)\n            }\n          })\n      }, 100)\n    }\n  },\n  showTooltip(feature: any, point: any) {\n    const latLng = this._map.unproject(point)\n    const shipType = CanvasShipUtils.getShipTypeCN(\n      Number.parseInt(this.getFeatureProperty(feature, 'type')) || 0\n    )\n    const content = `<div style=\"color: #0077ff\"><span style=\"width: 48px;text-align: right;display: inline-block;\">船舶名称：</span>${this.getFeatureProperty(\n      feature,\n      'name'\n    )}\n    </div>\n    <div><span style=\"width: 48px;text-align: right;display: inline-block;\">船舶类型：</span>${shipType}</div>\n    <div><span style=\"width: 48px;text-align: right;display: inline-block;\">速度：</span>${this.getFeatureProperty(\n      feature,\n      'sog'\n    )} 节</div>\n    <div><span style=\"width: 48px;text-align: right;display: inline-block;\">航向：</span>${this.getFeatureProperty(\n      feature,\n      'cog'\n    )}°</div>\n    <div><span style=\"width: 48px;text-align: right;display: inline-block;\">MMSI：</span>${this.getFeatureProperty(\n      feature,\n      'mmsi'\n    )}</div>`\n\n    this._tooltip.setContent(content)\n    this._tooltip.setLatLng(latLng)\n    if (!this._tooltip._mapToAdd) {\n      this._tooltip.addTo(this._map)\n    }\n  },\n  selectorShip(feature: any, point: any) {\n    const latLng = this._map.unproject(point)\n    this._map.getContainer().style.cursor = 'pointer'\n    this._selector.setLatLng(latLng)\n    if (!this._selector._mapToAdd) {\n      this._selector.addTo(this._map)\n    }\n  },\n  drawFeature(tileSize: any, context: any, feature: any) {\n    if (this.options.laneOptions.drawType === 'dot') {\n      this.drawFeatureByDot(tileSize, context, feature)\n      return\n    }\n    this.drawFeatureBySolidOrHollow(tileSize, context, feature)\n  },\n  drawFeatureByDot(\n    tileSize: { x: number; y: number },\n    context: {\n      beginPath: () => void\n      fillStyle: any\n      strokeStyle: string\n      lineWidth: number\n      arc: (\n        arg0: number,\n        arg1: number,\n        arg2: any,\n        arg3: number,\n        arg4: number,\n        arg5: boolean\n      ) => void\n      closePath: () => void\n      fill: () => void\n      stroke: () => void\n    },\n    feature: {\n      type: number\n      geometry: string | any[]\n      isBoundPoint: boolean\n      point: { x: number; y: number }\n    }\n  ) {\n    if (feature.type === 1) {\n      for (let i = 0; i < feature.geometry.length; i++) {\n        context.beginPath()\n        const color = this.options.laneOptions.colorByDefault\n        context.fillStyle = color\n        context.strokeStyle = 'transparent'\n        context.lineWidth = 0\n        const geometry = feature.geometry[i][0]\n        let x = geometry.x / 10\n        let y = geometry.y / 10\n        if (feature.isBoundPoint === true) {\n          x = feature.point.x - tileSize.x\n          y = feature.point.y - tileSize.y\n        }\n        context.arc(\n          x,\n          y,\n          this.options.laneOptions.radius,\n          0,\n          2 * Math.PI,\n          false\n        )\n        context.closePath()\n        context.fill()\n        context.stroke()\n      }\n    }\n  },\n  drawFeatureBySolidOrHollow(\n    tileSize: { x: number; y: number },\n    context: {\n      beginPath: () => void\n      fillStyle: string\n      strokeStyle: string\n      lineWidth: number\n      moveTo: (arg0: number, arg1: number) => void\n      lineTo: (arg0: number, arg1: number) => void\n      fill: () => void\n      stroke: () => void\n    },\n    feature: {\n      type: number\n      geometry: string | any[]\n      isBoundPoint: boolean\n      point: { x: number; y: number }\n    }\n  ) {\n    const drawType = this.options.laneOptions.drawType || 'solid'\n    const sog = this.getFeatureProperty(feature, 'sog')\n    const cog = this.getFeatureProperty(feature, 'cog')\n    const hdg = this.getFeatureProperty(feature, 'hdg')\n    const isStopped =\n      Number.parseInt(this.getFeatureProperty(feature, 'naviStatus')) === 1 ||\n      Number.parseInt(this.getFeatureProperty(feature, 'naviStatus')) === 5 ||\n      Number.parseInt(this.getFeatureProperty(feature, 'sog')) <= 0\n    if (feature.type === 1) {\n      for (let i = 0; i < feature.geometry.length; i++) {\n        context.beginPath()\n        const color = this.getColorByType(feature)\n        let lineWidth = 0\n        if (drawType === 'hollow') {\n          context.fillStyle = 'transparent'\n          context.strokeStyle = color\n          lineWidth = 0.5\n        } else {\n          context.fillStyle = color\n          context.strokeStyle = '#888'\n          lineWidth = 0\n        }\n        context.lineWidth = lineWidth\n        const geometry = feature.geometry[i][0]\n        let x = geometry.x / 10\n        let y = geometry.y / 10\n        if (feature.isBoundPoint === true) {\n          x = feature.point.x - tileSize.x\n          y = feature.point.y - tileSize.y\n        }\n        let point = L.point(x, y)\n        if (isStopped) {\n          point = point.add(L.point(0, -5 + lineWidth))\n          context.moveTo(point.x, point.y)\n          point = point.add(L.point(-5 + lineWidth, 5 - lineWidth))\n          context.lineTo(point.x, point.y)\n          point = point.add(L.point(5 - lineWidth, 5 - lineWidth))\n          context.lineTo(point.x, point.y)\n          point = point.add(L.point(5 - lineWidth, -5 + lineWidth))\n          context.lineTo(point.x, point.y)\n          point = point.add(L.point(-5 + lineWidth, -5 + lineWidth))\n          context.lineTo(point.x, point.y)\n        } else {\n          let angle = CanvasShipUtils.getAngle(hdg, cog, sog)\n          angle = Number(Number(angle) * (Math.PI / 180)) || 0\n          console.info(angle)\n          const point1 = this.rotate(L.point(0, -7 + lineWidth), angle)\n          const point2 = this.rotate(\n            L.point(-4 + lineWidth, 14 - lineWidth),\n            angle\n          )\n          const point3 = this.rotate(\n            L.point(8 - lineWidth, 0 - lineWidth),\n            angle\n          )\n          const point4 = this.rotate(\n            L.point(-4 + lineWidth, -14 + lineWidth),\n            angle\n          )\n          point = point.add(point1)\n          context.moveTo(point.x, point.y)\n          point = point.add(point2)\n          context.lineTo(point.x, point.y)\n          point = point.add(point3)\n          context.lineTo(point.x, point.y)\n          point = point.add(point4)\n          context.lineTo(point.x, point.y)\n        }\n        context.fill()\n        context.stroke()\n      }\n    }\n  },\n  _drawAllBounds() {\n    for (const tileKey in this._tiles) {\n      const context = this._tiles[tileKey].el.getContext('2d')\n      const tileSize = this.getTileSize()\n      const padding = 8\n      const tileBounds = this._tiles[tileKey].coords.scaleBy(tileSize)\n      const tileBox = L.bounds([\n        [tileBounds.x - padding, tileBounds.y - padding],\n        [\n          tileBounds.x + tileSize.x + padding,\n          tileBounds.y + tileSize.y + padding,\n        ],\n      ])\n      const features = this._findFeatureByBounds(tileBox)\n      let bounds: any[] = []\n      if (features && features.length > 0) {\n        bounds = bounds.concat(features)\n      }\n      bounds.forEach((feature) => {\n        this.drawFeature(tileBounds, context, feature)\n      })\n    }\n  },\n  _findFeature(event: { latlng: any }) {\n    let feature = null\n    let center = null\n    const point = this._map.project(event.latlng)\n    const tileSize = this.getTileSize()\n    for (const tileKey in this._tiles) {\n      const points = this._tiles[tileKey].el.points\n      if (!points || points === null || points.length === 0) {\n        continue\n      }\n      const tileBounds = this._tiles[tileKey].coords.scaleBy(tileSize)\n      if (\n        L.bounds([\n          [tileBounds.x, tileBounds.y],\n          [tileBounds.x + tileSize.x, tileBounds.y + tileSize.y],\n        ]).contains(point)\n      ) {\n        feature = points.find((pointFeature: { point: any }) => {\n          const pointObj = pointFeature.point,\n            boundBox = [\n              [pointObj.x - 8, pointObj.y - 8],\n              [pointObj.x + 8, pointObj.y + 8],\n            ],\n            bounds = L.bounds(boundBox.map(([x, y]) => L.point(x, y)))\n          if (bounds.contains(point)) {\n            center = bounds.getCenter()\n            return true\n          }\n          return false\n        })\n        break\n      }\n    }\n    return {\n      feature,\n      center,\n    }\n  },\n  _findFeatureByBounds(bounds: PointExpression | BoundsExpression) {\n    let features: any[] = []\n    const tileSize = this.getTileSize()\n    for (const tileKey in this._tiles) {\n      const boundPoints = this._tiles[tileKey].el.bounds_points\n      if (boundPoints === null || boundPoints.length === 0) {\n        continue\n      }\n      const tileBounds = this._tiles[tileKey].coords.scaleBy(tileSize)\n      if (\n        L.bounds([\n          [tileBounds.x, tileBounds.y],\n          [tileBounds.x + tileSize.x, tileBounds.y + tileSize.y],\n        ]).intersects(bounds as L.Bounds) ||\n        L.bounds([\n          [tileBounds.x, tileBounds.y],\n          [tileBounds.x + tileSize.x, tileBounds.y + tileSize.y],\n        ]).contains(bounds) ||\n        (bounds instanceof L.Bounds &&\n          bounds.contains(\n            L.bounds([\n              [tileBounds.x, tileBounds.y],\n              [tileBounds.x + tileSize.x, tileBounds.y + tileSize.y],\n            ])\n          ))\n      ) {\n        const filteredFeatures = boundPoints.filter(\n          (pointFeature: { point: any }) => {\n            const pointObj = pointFeature.point\n            return (bounds as L.Bounds).contains(pointObj)\n          }\n        )\n        features = features.concat(filteredFeatures)\n      }\n    }\n    return features\n  },\n  getDrawFeaturesCount() {\n    let count = 0\n    for (const tileKey in this._tiles) {\n      const points = this._tiles[tileKey].el.points\n      if (points) {\n        count += points.length\n      }\n    }\n    return count\n  },\n  getColorByType(feature: any) {\n    const type = this.getFeatureProperty(feature, 'type')\n    if (type === '' || this.options.laneOptions.colorByType === null) {\n      return this.options.laneOptions.colorByDefault\n    }\n    const typeNumber = Number.parseInt(type)\n    return (\n      this.options.laneOptions.colorByType[typeNumber] ||\n      this.options.laneOptions.colorByDefault\n    )\n  },\n  loadArrayBuffer(url: string, signal: any) {\n    return fetch(url, { signal }).then((response) => {\n      if (response.ok) {\n        return response.arrayBuffer()\n      }\n      if (response.status !== 404) {\n        throw this.err(url, response.status, response.statusText)\n      }\n    })\n  },\n  loadJson(url: string, signal: any) {\n    return fetch(url, { signal }).then((response) => {\n      if (response.ok) {\n        return response.json()\n      }\n      if (response.status !== 404) {\n        throw this.err(url, response.status, response.statusText)\n      }\n      throw new Error('Network response was not ok.')\n    })\n  },\n  err(...args: any[]) {\n    return new Error(args.join(': '))\n  },\n  rotate(point: { x: any; y: any }, angle: number) {\n    const x = point.x\n    const y = point.y\n    const sin = Math.sin(angle)\n    const cos = Math.cos(angle)\n    return L.point([x * cos - y * sin, x * sin + y * cos])\n  },\n  // 绘制框线\n  drawTileBox(\n    context: {\n      save: () => void\n      globalAlpha: number\n      lineWidth: number\n      strokeStyle: string\n      fillStyle: string\n      fillText: (arg0: string, arg1: number, arg2: number) => void\n      fillRect: (arg0: number, arg1: number, arg2: number, arg3: number) => void\n      moveTo: (arg0: number, arg1: number) => void\n      lineTo: (arg0: number, arg1: any) => void\n      stroke: () => void\n      restore: () => void\n    },\n    coords: { x: any; y: any; z: any; scaleBy: (arg0: any) => any }\n  ) {\n    const tileSize = this.getTileSize()\n\n    context.save()\n    context.globalAlpha = 1\n    context.lineWidth = 1\n    // context.fillRect(0, 0, tileSize.x, 50)\n    context.strokeStyle = 'red'\n    context.fillStyle = 'red'\n    context.fillText(\n      `x: ${coords.x}, y: ${coords.y}, zoom: ${coords.z}`,\n      20,\n      20\n    )\n    context.moveTo(0, 0)\n    context.lineTo(0, tileSize.y)\n    context.lineTo(tileSize.x, tileSize.y)\n\n    context.stroke()\n    context.restore()\n  },\n  getFeatureProperty(\n    feature: { properties: { [x: string]: any } | null } | null,\n    key: string | number\n  ) {\n    const fieldMap = this.options.laneOptions.fieldMap || {\n      name: 'name',\n      mmsi: 'mmsi',\n      type: 't',\n      sog: 's',\n      hdg: 'h',\n      cog: 'c',\n      naviStatus: 'n',\n      utc: 'u',\n      key: 'k',\n    }\n    if (feature === null || feature.properties === null) {\n      console.error('Error feature or feature.properties is null.')\n      return ''\n    }\n    return feature.properties[fieldMap[key] || key] || ''\n  },\n}) as any\n\nconst canvasShip = (url: any, options: any) => {\n  const canvasShipLayer = new CanvasShipLayer(url, options)\n  return canvasShipLayer\n}\n\nexport { CanvasShipLayer, canvasShip }\n"],"names":["T","l","GridLayer","extend","version","options","laneOptions","drawType","radius","enableMousemove","enableLaneClick","colorByType","colorByDefault","shipDetailURL","isShowTileBox","isDrawBoundPoint","fieldMap","name","mmsi","type","sog","hdg","cog","naviStatus","utc","key","wmsParams","onLoad","initialize","t","e","this","setOptions","loadVectorTileDependencies","o","tooltip","direction","opacity","className","_tooltip","i","iconUrl","n","icon","iconSize","iconAnchor","_selector","marker","_abortController_shipDetail","_setTimeout_shipDetail","getVersion","_url","Util","_map","redraw","createTile","document","createElement","getTileSize","width","x","height","y","getContext","loadTileData","onAdd","window","L","prototype","call","on","_onLoaded","_onTileLoaded","_onTileUnload","_onZoomLevelChange","_onBaselayerchange","_onMouseMove","_onMapClick","onRemove","remove","clearTimeout","abort","off","_abortLoading","_tiles","coords","z","_tileZoom","el","dataLoaded","abortController","DomUtil","_findFeature","feature","selectorShip","center","openTooltip","getContainer","style","cursor","getShipDetail","fire","tile","points","scaleBy","bounds","forEach","s","p","geometry","h","d","point","a","unproject","latlng","g","contains","f","isBoundPoint","bounds_points","push","_drawAllBounds","getBBOXByCoords","_tileCoordsToNwSe","crs","project","min","max","Number","parseFloat","code","join","getTileUrl","replaceAll","Pbf","VectorTile","Promise","src","onload","onerror","head","appendChild","AbortController","drawTileBox","loadArrayBuffer","signal","then","layers","length","u","loadGeometry","r","getFeatureProperty","c","m","_","getNumberLEValue","b","xTo360","properties","drawFeature","features","catch","showTooltip","setTimeout","loadJson","getShipTypeCN","parseInt","setContent","setLatLng","_mapToAdd","addTo","drawFeatureBySolidOrHollow","drawFeatureByDot","beginPath","fillStyle","strokeStyle","lineWidth","arc","Math","PI","closePath","fill","stroke","getColorByType","add","moveTo","lineTo","getAngle","rotate","w","B","A","_findFeatureByBounds","concat","find","map","getCenter","intersects","Bounds","filter","getDrawFeaturesCount","fetch","ok","arrayBuffer","status","err","statusText","json","Error","sin","cos","save","globalAlpha","fillText","restore","v"],"mappings":"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"}