{"version":3,"file":"AreaShipsDataGridSymbol.mjs","sources":["../../../../../packages/sdk/utils/AreaShipsDataGridSymbol.ts"],"sourcesContent":["import L from 'leaflet'\nimport _, { isEmpty, isNull } from 'lodash-unified'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { GPS } from '@map-sdk/sdk/utils/GPS'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\ninterface Ship {\n  // 假设Ship类型有以下属性，实际项目中请根据实际情况定义完整\n  shipid: string\n  mmsi: string\n  lat: number\n  lng: number\n  lastdyn: Date\n  lastdyn_active: boolean\n  country?: number\n  // 其他相关属性@map-sdk/sdk.\n}\ninterface GridIndex {\n  [gridKey: string]: Array<{ lat: number; lng: number }>\n}\n\nclass AreaShipsDataGridSymbol extends L.Class {\n  options: {\n    pk: string\n    latlngk: string\n    grid_size: number\n  } = {\n    pk: 'shipid',\n    latlngk: '',\n    grid_size: 0.05,\n  }\n  _map: MyMap\n  _items: Record<string, Ship> = {}\n  _items_count: number\n  _index_grid: { [key: string]: { [key: string]: Ship } }\n  _index_mmsi: { [key: string]: string }\n\n  private _indexGrid: GridIndex = {}\n  // @ts-ignore: TS6133\n  private _gridShipsViewFilter: Record<string, { lat: number; lng: number }[]> =\n    {}\n  constructor(\n    map: MyMap,\n    defaultOptions: Partial<AreaShipsDataGridSymbol['options']> = {}\n  ) {\n    super()\n    this._map = map\n    this._items = {}\n    this._items_count = 0\n    this._index_grid = {}\n    this._index_mmsi = {}\n    // 现在 options 已经有了初始值，所以可以安全地合并 defaultOptions\n    this.options = {\n      ...this.options,\n      grid_size: 0.05,\n      ...defaultOptions,\n    }\n  }\n\n  _getItemsKey(data: Ship): string {\n    return isEmpty(data) || isNull((data as any)[this.options.pk])\n      ? ''\n      : `pk_${(data as any)[this.options.pk]}`\n  }\n\n  _getMmsiKey(data: Ship): string {\n    return isEmpty(data) || isNull(data.mmsi) //|| data.mmsi.indexOf('*') > -1\n      ? ''\n      : `mmsi_${data.mmsi}`\n  }\n\n  _getGridKey(data: Ship): string {\n    const latlngk = isEmpty(this.options.latlngk)\n      ? L.latLng(data.lat, data.lng)\n      : (data as any)[this.options.latlngk]\n    if (\n      isEmpty(latlngk) ||\n      isNull(latlngk.lat) ||\n      isNull(latlngk.lng) ||\n      (latlngk.lat === 0 && latlngk.lng === 0)\n    ) {\n      return ''\n    }\n    const gridSize = this.options.grid_size\n    const roundedGridSize = gridSize !== 0.05 ? 1 : gridSize\n    return CanvasShipUtils.getGridKeyByLatLng(\n      latlngk.lat,\n      latlngk.lng,\n      roundedGridSize,\n      '',\n      '_'\n    )\n  }\n\n  _getGridByBounds05(bounds: L.LatLngBounds): string[] {\n    const grids: string[] = []\n    const swLat = bounds.getSouthWest().lat\n    const swLng = bounds.getSouthWest().lng\n    const neLat = bounds.getNorthEast().lat\n    const neLng = bounds.getNorthEast().lng\n    const gridKeyByLatLngStr1 = CanvasShipUtils.getGridKeyByLatLng(\n      swLat,\n      swLng,\n      0.05,\n      '',\n      '_'\n    ).split('_')\n    const gridKeyByLatLngStr2 = CanvasShipUtils.getGridKeyByLatLng(\n      neLat,\n      neLng,\n      0.05,\n      '',\n      '_'\n    ).split('_')\n\n    const roundedSWLat = Math.round(100 * Number(gridKeyByLatLngStr1[0]))\n    const roundedSWLng = Math.round(100 * Number(gridKeyByLatLngStr1[1]))\n    const roundedNELat = Math.round(100 * Number(gridKeyByLatLngStr2[0]))\n    const roundedNELng = Math.round(100 * Number(gridKeyByLatLngStr2[1]))\n\n    for (let i = roundedSWLat; i <= roundedNELat; i += 5)\n      for (let j = roundedSWLng; j <= roundedNELng; j += 5)\n        grids.push(`${(i / 100).toFixed(2)}_${(j / 100).toFixed(2)}`)\n\n    return grids\n  }\n\n  _getGridByBounds(bounds: L.LatLngBounds): string[] {\n    const grids: string[] = []\n    const slat = bounds.getSouthWest().lat\n    const slng = bounds.getSouthWest().lng\n    const nlat = bounds.getNorthEast().lat\n    const nlng = bounds.getNorthEast().lng\n\n    for (let i = slat; i <= nlat; i++)\n      for (let j = slng; j <= nlng; j++) grids.push(`${i}_${j}`)\n\n    return grids\n  }\n\n  getItemByBounds(bound: L.LatLngBounds): Ship[] {\n    const startTime = Date.now()\n    const returnList: Ship[] = []\n\n    if (isEmpty(bound)) {\n      return []\n    }\n\n    const center = bound.getCenter()\n    let slat = bound.getSouthWest().lat\n    let slng = bound.getSouthWest().lng\n    let nlat = bound.getNorthEast().lat\n    let nlng = bound.getNorthEast().lng\n\n    if (this._map.offsetC && !GPS.outOfChina(center.lat, center.lng)) {\n      const gpsSLatLon = GPS.gcj_decrypt(slat, slng, false)\n      const gpsNLatLon = GPS.gcj_decrypt(nlat, nlng, false)\n      bound = L.latLngBounds(\n        L.latLng(gpsSLatLon.lat, gpsSLatLon.lon),\n        L.latLng(gpsNLatLon.lat, gpsNLatLon.lon)\n      )\n    }\n\n    slat = bound.getSouthWest().lat\n    slng = bound.getSouthWest().lng\n    nlat = bound.getNorthEast().lat\n    nlng = bound.getNorthEast().lng\n\n    const data = Object.keys(this._index_grid)\n\n    if (\n      ((Math.abs(nlat - slat) / this.options.grid_size) *\n        Math.abs(nlng - slng)) /\n        this.options.grid_size <\n      data.length\n    ) {\n      const gridByBounds =\n        this.options.grid_size === 0.05\n          ? this._getGridByBounds05(bound)\n          : this._getGridByBounds(bound)\n\n      for (const gridByBound of gridByBounds) {\n        const indexGrid = this._index_grid[gridByBound]\n        if (indexGrid) {\n          for (const key in indexGrid) {\n            const value = indexGrid[key]\n            returnList.push(value)\n          }\n        }\n      }\n    } else {\n      for (const gridByBound of data) {\n        const gridByBounds = gridByBound.split('_')\n        if (\n          Number.parseInt(gridByBounds[0]) >=\n            Number.parseInt(slat.toString()) &&\n          Number.parseInt(gridByBounds[0]) <=\n            Number.parseInt(nlat.toString()) &&\n          Number.parseInt(gridByBounds[1]) >=\n            Number.parseInt(slng.toString()) &&\n          Number.parseInt(gridByBounds[1]) <= Number.parseInt(nlng.toString())\n        ) {\n          for (const key in this._index_grid[gridByBound]) {\n            const value = this._index_grid[gridByBound][key]\n            returnList.push(value)\n          }\n        }\n      }\n    }\n\n    console.debug('getItemByBounds time:', Date.now() - startTime)\n    return returnList\n  }\n\n  getItemByBoundsForChouXi(\n    bounds: L.LatLngBounds,\n    zoom: number,\n    limit: number\n  ): { lat: number; lng: number }[] | null {\n    let result: any = []\n\n    if (isEmpty(bounds)) {\n      return null\n    }\n\n    const center = bounds.getCenter()\n    const southWest = bounds.getSouthWest()\n    const northEast = bounds.getNorthEast()\n    let latSouthWest = southWest.lat\n    let lngSouthWest = southWest.lng\n    let latNorthEast = northEast.lat\n    let lngNorthEast = northEast.lng\n\n    if (this._map.offsetC && !GPS.outOfChina(center.lat, center.lng)) {\n      const decryptedSouthWest = GPS.gcj_decrypt(\n        latSouthWest,\n        lngSouthWest,\n        true\n      ) as any\n      const decryptedNorthEast = GPS.gcj_decrypt(\n        latNorthEast,\n        lngNorthEast,\n        true\n      ) as any\n      bounds = L.latLngBounds(\n        L.latLng(decryptedSouthWest.lat, decryptedSouthWest.lng),\n        L.latLng(decryptedNorthEast.lat, decryptedNorthEast.lng)\n      )\n    }\n\n    latSouthWest = bounds.getSouthWest().lat\n    lngSouthWest = bounds.getSouthWest().lng\n    latNorthEast = bounds.getNorthEast().lat\n    lngNorthEast = bounds.getNorthEast().lng\n\n    const gridShipsInViewFilter: Record<string, any> = {}\n    const indexGrid = this._map._indexGrid\n    const keys = Object.keys(indexGrid)\n    const keysLength = keys.length\n\n    if (\n      ((Math.abs(latNorthEast - latSouthWest) / this.options.grid_size) *\n        Math.abs(lngNorthEast - lngSouthWest)) /\n        this.options.grid_size <\n      keysLength\n    ) {\n      const grids =\n        zoom === 0.05\n          ? this._map._getGridByBounds05(bounds)\n          : this._map._getGridByBounds(bounds)\n      for (const gridKey of grids) {\n        const ships = indexGrid[gridKey]\n        if (ships) {\n          ships.forEach((ship: { lat: number; lng: number }) => {\n            const gridKeyByLatLng = CanvasShipUtils.getGridKeyByLatLng(\n              ship.lat,\n              ship.lng,\n              zoom,\n              'g_',\n              '_'\n            )\n            if (\n              !(gridKeyByLatLng in gridShipsInViewFilter) ||\n              gridShipsInViewFilter[gridKeyByLatLng].length < limit\n            ) {\n              gridShipsInViewFilter[gridKeyByLatLng] =\n                gridShipsInViewFilter[gridKeyByLatLng] || []\n              gridShipsInViewFilter[gridKeyByLatLng].push(ship)\n            }\n          })\n        }\n      }\n    } else {\n      for (let i = 0; i < keysLength; i++) {\n        const gridKey = keys[i]\n        const gridBounds = gridKey.split('_')\n        if (\n          Number(gridBounds[0]) >= latSouthWest &&\n          Number(gridBounds[0]) <= latNorthEast &&\n          Number(gridBounds[1]) >= lngSouthWest &&\n          Number(gridBounds[1]) <= lngNorthEast\n        ) {\n          const ships = indexGrid[gridKey]\n          if (ships) {\n            ships.forEach((ship: { lat: number; lng: number }) => {\n              const gridKeyByLatLng = CanvasShipUtils.getGridKeyByLatLng(\n                ship.lat,\n                ship.lng,\n                zoom,\n                'g_',\n                '_'\n              )\n              if (\n                !(gridKeyByLatLng in gridShipsInViewFilter) ||\n                gridShipsInViewFilter[gridKeyByLatLng].length < limit\n              ) {\n                gridShipsInViewFilter[gridKeyByLatLng] =\n                  gridShipsInViewFilter[gridKeyByLatLng] || []\n                gridShipsInViewFilter[gridKeyByLatLng].push(ship)\n              }\n            })\n          }\n        }\n      }\n    }\n\n    Object.keys(gridShipsInViewFilter).forEach((key) => {\n      result = result.concat(gridShipsInViewFilter[key])\n    })\n\n    return result\n  }\n\n  /**\n   * 计算中国偏移坐标的方法提取为\n   * @param areaBounds\n   * @returns\n   */\n  // @ts-ignore: TS6133\n  private adjustBoundsForChina(areaBounds: L.LatLngBounds): L.LatLngBounds {\n    const { getCenter, getSouthWest, getNorthEast } = areaBounds\n    const center = getCenter()\n\n    if (this._map.offsetC && !GPS.outOfChina(center.lat, center.lng)) {\n      const gcjDecryptedSW = GPS.gcj_decrypt(\n        getSouthWest().lat,\n        getSouthWest().lng,\n        false\n      )\n      const gcjDecryptedNE = GPS.gcj_decrypt(\n        getNorthEast().lat,\n        getNorthEast().lng,\n        false\n      )\n\n      return L.latLngBounds(\n        L.latLng(gcjDecryptedSW.lat, gcjDecryptedSW.lon),\n        L.latLng(gcjDecryptedNE.lat, gcjDecryptedNE.lon)\n      )\n    }\n\n    return areaBounds\n  }\n\n  /**\n   * 获取目标网格的方法提取为\n   * @param bounds\n   * @param gridSize\n   * @returns\n   */\n  // @ts-ignore: TS6133\n  private getTargetGrids(bounds: L.LatLngBounds, gridSize: number): string[] {\n    const keys = Object.keys(this._indexGrid)\n    const { getSouthWest, getNorthEast } = bounds\n    const southwestLat = getSouthWest().lat\n    const southwestLng = getSouthWest().lng\n    const northeastLat = getNorthEast().lat\n    const northeastLng = getNorthEast().lng\n\n    if (\n      ((Math.abs(northeastLat - southwestLat) / gridSize) *\n        Math.abs(northeastLng - southwestLng)) /\n        gridSize <\n      keys.length\n    ) {\n      return 0.05 === gridSize\n        ? this._getGridByBounds05(bounds)\n        : this._getGridByBounds(bounds)\n    }\n\n    return keys.filter((gridKey) => {\n      const [latStr, lngStr] = gridKey.split('_')\n      const lat = Number.parseInt(latStr)\n      const lng = Number.parseInt(lngStr)\n\n      return (\n        lat >= southwestLat &&\n        lat <= northeastLat &&\n        lng >= southwestLng &&\n        lng <= northeastLng\n      )\n    })\n  }\n\n  updateDatas(data: Ship | Ship[], isRemove = false): void {\n    const dataList: Ship[] = []\n    if (!isEmpty(data)) {\n      if (typeof data === 'object' && !Array.isArray(data)) {\n        dataList.push(data as Ship)\n      } else if (Array.isArray(data)) {\n        dataList.push(...data)\n      }\n\n      for (const item of dataList) {\n        if (!isEmpty(item)) {\n          const itemKey = this._getItemsKey(item)\n          const gridKey = this._getGridKey(item)\n          if (!isEmpty(gridKey) && !isEmpty(itemKey)) {\n            ;(item as any)['gridkey'] = gridKey\n\n            let existingItem: Ship | undefined\n            let needsUpdate = false\n\n            if (!isRemove) {\n              needsUpdate = this.hasItem(item)\n              if (needsUpdate) {\n                existingItem = this._items[itemKey]\n                this.removeIndex(existingItem!)\n              }\n            }\n\n            if (!needsUpdate) {\n              this._items_count++\n            }\n\n            item.country = CanvasShipUtils.isCNShip(item.mmsi)\n\n            if (\n              !(\n                existingItem &&\n                existingItem.lastdyn &&\n                item.lastdyn &&\n                existingItem.lastdyn_active &&\n                item.lastdyn_active &&\n                existingItem.lastdyn > item.lastdyn\n              )\n            ) {\n              for (const key in item) {\n                if ((item as any)[key] === undefined) {\n                  delete (item as any)[key]\n                }\n              }\n\n              this._items[itemKey] = { ...existingItem, ...item }\n            }\n\n            this.addIndex(this._items[itemKey])\n          }\n        }\n      }\n    }\n  }\n  addIndex(data: Ship) {\n    if (!isEmpty(data)) {\n      const mmsiKey = this._getMmsiKey(data)\n      const gridKey = this._getGridKey(data)\n      const itemsKey = this._getItemsKey(data)\n      isEmpty(gridKey) ||\n        (gridKey in this._index_grid || (this._index_grid[gridKey] = {}),\n        (this._index_grid[gridKey][itemsKey] = data))\n      isEmpty(mmsiKey) || (this._index_mmsi[mmsiKey] = itemsKey)\n    }\n  }\n  removeIndex(data: Ship) {\n    if (!isEmpty(data)) {\n      const mmsiKey = this._getMmsiKey(data)\n      isEmpty(mmsiKey) || delete this._index_mmsi[mmsiKey]\n      const gridKey = this._getGridKey(data)\n      const itemsKey = this._getItemsKey(data)\n      !isEmpty(gridKey) &&\n        !isEmpty(itemsKey) &&\n        this._index_grid[gridKey] &&\n        this._index_grid[gridKey][itemsKey] &&\n        delete this._index_grid[gridKey][itemsKey]\n    }\n  }\n  hasItem(data: Ship) {\n    return this._getItemsKey(data) in this._items\n  }\n  getItemByPK(shipid: number) {\n    if (isNull(shipid)) return null\n    const data = {} as any\n    data[this.options.pk] = shipid\n    return this._items[this._getItemsKey(data)]\n  }\n  getItemByObj(data: Ship) {\n    if (isEmpty(data) || isEmpty((data as any)[this.options.pk])) return null\n    return this._items[this._getItemsKey(data)]\n  }\n  getItemCount() {\n    return isEmpty(this._items) ? 0 : this._items_count\n  }\n  getItemByMMSI(mmsi: string): Ship | null {\n    if (isNull(mmsi)) return null\n    const data = {} as any\n    data.mmsi = mmsi\n    const mmsiKey = this._getMmsiKey(data)\n    return this._items[this._index_mmsi[mmsiKey]]\n  }\n  deleteAll() {\n    this._items = {}\n    this._items_count = 0\n    this._index_grid = {}\n    this._index_mmsi = {}\n  }\n  deleteByPK(data: any) {\n    const itemByPK = this.getItemByPK(data)\n    if (!isEmpty(itemByPK)) {\n      this.removeIndex(itemByPK as any)\n      delete this._items[this._getItemsKey(itemByPK as any)]\n      this._items_count -= 1\n    }\n  }\n}\n\nexport default (\n  map: MyMap,\n  options: Partial<AreaShipsDataGridSymbol['options']>\n) => new AreaShipsDataGridSymbol(map, options)\n"],"names":["b","c","Class","constructor","t","e","super","this","options","pk","latlngk","grid_size","_items","_indexGrid","_gridShipsViewFilter","_map","_items_count","_index_grid","_index_mmsi","_getItemsKey","a","K","_getMmsiKey","mmsi","_getGridKey","latLng","lat","lng","n","s","N","getGridKeyByLatLng","_getGridByBounds05","getSouthWest","g","getNorthEast","l","i","split","r","m","Math","round","Number","d","h","o","y","_","push","toFixed","_getGridByBounds","getItemByBounds","Date","now","getCenter","offsetC","f","outOfChina","gcj_decrypt","latLngBounds","lon","Object","keys","abs","length","parseInt","toString","getItemByBoundsForChouXi","u","L","k","S","forEach","B","p","I","concat","adjustBoundsForChina","getTargetGrids","filter","updateDatas","Array","isArray","gridkey","hasItem","removeIndex","country","isCNShip","lastdyn","lastdyn_active","addIndex","getItemByPK","getItemByObj","getItemCount","getItemByMMSI","deleteAll","deleteByPK","x","G"],"mappings":"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"}