{"version":3,"file":"WindyService.mjs","sources":["../../../../../../../packages/sdk/plugins/weather/Weather/WindyService.ts"],"sourcesContent":["/*\n * @Author: Yolo\n * @Date: 2024-06-25 10:20:39\n * @Last Modified by: Yolo\n * @Last Modified time: 2024-07-17 15:37:07\n * @Desc 风场、海流场\n */\nimport L from 'leaflet'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\n// import 'leaflet-velocity/dist/leaflet-velocity.min.css'\nimport 'leaflet-velocity'\nimport { showWeatherTipMessage } from '../util/ShowWeatherTipMessage'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\ninterface WindyServiceOptions {\n  ak: string\n  type: number\n  data: any\n  callback: (done: (list: any) => void) => void\n}\n\ninterface VelocityLayerConfig {\n  header: {\n    dx: number\n    dy: number\n    nx: number\n    ny: number\n    la1: number\n    la2: number\n    lo1: number\n    lo2: number\n    parameterUnit: string\n    parameterNumber: number\n    parameterCategory: number\n    refTime: string\n    numberPoints: number\n  }\n  data: number[]\n}\n\nclass WindyService {\n  _viewState: boolean\n  _map: MyMap\n  lyGroup: L.LayerGroup = L.layerGroup()\n  _isView: boolean\n  _velocityLayers: any // 根据实际情况替换成具体的velocityLayer类型\n  _forecasttime: any\n  _QBBeginTime: any\n  options: any = {}\n  weatherMsg: any\n  constructor(map: MyMap, options?: Partial<WindyServiceOptions>) {\n    this._map = map\n    this._viewState = false\n    this._velocityLayers = undefined\n    this._isView = true\n    L.Util.extend(this.options, options)\n  }\n  private _Event = {\n    zoomend: () => {\n      this._zoomChange()\n    },\n    baselayerchange: () => {\n      this._zoomChange(false, true)\n    },\n  }\n\n  registEvent() {\n    this.offRegistEvent()\n    this._map.on('zoomend', this._Event.zoomend)\n    this._map.on('baselayerchange', this._Event.baselayerchange)\n  }\n\n  offRegistEvent() {\n    this._map.off('zoomend', this._Event.zoomend)\n    this._map.off('baselayerchange', this._Event.baselayerchange)\n    this.weatherMsg && this.weatherMsg.offRegisterEvent()\n  }\n\n  init_velocityLayers(forecastTime: string, QBBeginTime: any): boolean {\n    const type = this.options.type\n    const typeStr = `type_${type}`\n    let time = `${CanvasShipUtils.dataFormat(\n      new Date(),\n      'YYYY-MM-DD'\n    )} 20:00:00`\n    QBBeginTime[typeStr] && (time = QBBeginTime[typeStr].time)\n    console.log(time)\n    // const weatherDataUrl = ShipxyOptions.weather.weatherDataUrl\n    //   .replace('{k}', (this._map.options as any).ak)\n    //   .replace('{type}', `${type}`)\n    //   .replace('{time}', time)\n    //   .replace('{forecasttime}', forecastTime)\n\n    switch (type) {\n      case 13:\n        this.weatherMsg = showWeatherTipMessage(this._map, 'showSeaBreeze')\n        this.init_velocityLayersCallback()\n        break\n      case 15:\n        this.weatherMsg = showWeatherTipMessage(this._map, 'showHL')\n        this.init_OceanCurrentLayersCallback()\n    }\n\n    return true\n  }\n\n  /**\n   * 渲染风场及还流场\n   * @param data\n   * @param velocityType\n   */\n  private render(data: any[], velocityType: string) {\n    const config: VelocityLayerConfig[] = [\n      {\n        header: {\n          dx: 1,\n          dy: 1,\n          nx: 360,\n          ny: 181,\n          la1: 90,\n          la2: -90,\n          lo1: 0,\n          lo2: 359,\n          parameterUnit: 'm.s-1',\n          parameterNumber: 2,\n          parameterCategory: 2,\n          refTime: '',\n          numberPoints: 65160,\n        },\n        data: [],\n      },\n      {\n        header: {\n          dx: 1,\n          dy: 1,\n          nx: 360,\n          ny: 181,\n          la1: 90,\n          la2: -90,\n          lo1: 0,\n          lo2: 359,\n          parameterUnit: 'm.s-1',\n          parameterNumber: 3,\n          parameterCategory: 2,\n          refTime: '',\n          numberPoints: 65160,\n        },\n        data: [],\n      },\n    ]\n\n    // 设置config中header的公共属性\n    config[0].header.nx = config[1].header.nx = 360\n    config[0].header.ny = config[1].header.ny = 181\n    config[0].header.la1 = config[1].header.la1 = 90\n    config[0].header.la2 = config[1].header.la2 = -90\n    config[0].header.lo1 = config[1].header.lo1 = 0\n    config[0].header.lo2 = config[1].header.lo2 = 359\n    config[0].header.numberPoints = config[1].header.numberPoints = 65160\n\n    const dataList: any[][] = []\n\n    data.forEach((item: any, index: number, array: any[]) => {\n      if (index % 360 === 0) {\n        const chunk: any[] =\n          index === 0 ? array.slice(-360) : array.slice(-index - 360, -index)\n        dataList.push(chunk.slice(-180), chunk.slice(0, 180))\n      }\n    })\n\n    const allDataItems: any[] = []\n    dataList.forEach((itemList) => {\n      itemList.forEach((item) => {\n        allDataItems.push(item)\n      })\n    })\n\n    const uComponents: number[] = []\n    const vComponents: number[] = []\n    const radian = Math.PI / 180\n\n    for (const allDataItem of allDataItems) {\n      const values = allDataItem.value.split('/')\n      let direction = Number.parseFloat(values[1])\n      let speed = Number.parseFloat(values[0])\n\n      if (velocityType === '海流场') {\n        direction = Math.round(direction)\n\n        if (\n          Number.isNaN(speed) ||\n          Math.abs(speed) === 32767 ||\n          speed <= 0.012\n        ) {\n          speed = 0\n        } else {\n          speed *= 50\n        }\n      } else {\n        if (Number.isNaN(speed) || speed === 32767) {\n          speed = 0\n        }\n      }\n\n      const uComponent = speed * Math.sin(direction * radian)\n      const vComponent = speed * Math.cos(direction * radian)\n\n      uComponents.push(-uComponent)\n      vComponents.push(-vComponent)\n    }\n\n    config[0].data = uComponents\n    config[1].data = vComponents\n\n    if (this._velocityLayers) {\n      this._velocityLayers.setData(config)\n    } else {\n      this._velocityLayers = (L as any).velocityLayer({\n        displayValues: false,\n        displayOptions: {\n          velocityType,\n          displayPosition: 'bottomright',\n          displayEmptyString: '无数据',\n        },\n        data: config,\n        maxVelocity: 15,\n        colorScale: [\n          '#2468B4',\n          '#3C9DC2',\n          '#80CDC1',\n          '#97DAA8',\n          '#C6E7B5',\n          '#EEF7D9',\n          '#FCD97D',\n          '#FFB664',\n          '#FC964B',\n          '#FA7034',\n          '#F54020',\n          '#ED2D1C',\n          '#DC1820',\n          '#B40023',\n        ],\n        elaneMap: this._map,\n        frameRate: 15,\n        opacity: 1,\n      })\n\n      this._map.addLayer(this._velocityLayers)\n    }\n\n    this._velocityLayers._clearWind()\n    setTimeout(() => {\n      this._velocityLayers._startWindy()\n    }, 200)\n  }\n\n  init_velocityLayersCallback() {\n    const done = (list: any) => {\n      this.render(list, '风场')\n    }\n    if (this.options.callback) {\n      this.options.callback(done)\n      return\n    }\n    done(this.options.data)\n  }\n\n  init_OceanCurrentLayersCallback() {\n    const done = (list: any) => {\n      this.render(list, '海流场')\n    }\n    if (this.options.callback) {\n      this.options.callback(done)\n      return\n    }\n    done(this.options.data)\n  }\n\n  show(forecastTime: string, QBBeginTime: any) {\n    this._isView = true\n    this._forecasttime = forecastTime\n    this._QBBeginTime = QBBeginTime\n    this.registEvent()\n\n    if (this.init_velocityLayers(this._forecasttime, this._QBBeginTime)) {\n      this._velocityLayers._clearWind()\n      setTimeout(() => {\n        this._velocityLayers._startWindy()\n      }, 200)\n    }\n  }\n\n  _zoomChange(isRemove?: boolean, isClearLayer?: boolean) {\n    if (this._map.getZoom() >= 2 && this._isView) {\n      if (isClearLayer) {\n        this._velocityLayers._clearWind()\n        setTimeout(() => {\n          this._velocityLayers._startWindy()\n        }, 400)\n      } else {\n        this._velocityLayers._startWindy()\n      }\n    } else {\n      this._hide(isRemove)\n    }\n  }\n\n  hide() {\n    this._isView = false\n    this._hide(true)\n  }\n\n  _hide(isRemove?: boolean) {\n    this.offRegistEvent()\n    this.lyGroup && this.lyGroup.clearLayers()\n    if (this._velocityLayers) {\n      this._velocityLayers._clearWind()\n      if (isRemove) {\n        this._velocityLayers.remove()\n        this._velocityLayers = undefined\n      }\n    }\n  }\n}\n\nconst windyService = (\n  map: MyMap,\n  options?: Partial<WindyServiceOptions>\n): WindyService => {\n  return new WindyService(map, options)\n}\n\nexport { WindyService, windyService }\n"],"names":["_","constructor","t","a","this","lyGroup","h","layerGroup","options","_Event","zoomend","_zoomChange","baselayerchange","_map","_viewState","_velocityLayers","_isView","Util","extend","registEvent","offRegistEvent","on","off","weatherMsg","offRegisterEvent","init_velocityLayers","e","type","n","o","b","dataFormat","Date","time","p","init_velocityLayersCallback","init_OceanCurrentLayersCallback","render","header","dx","dy","nx","ny","la1","la2","lo1","lo2","parameterUnit","parameterNumber","parameterCategory","refTime","numberPoints","data","forEach","l","s","r","i","slice","push","c","m","d","Math","PI","value","split","Number","parseFloat","round","isNaN","abs","u","sin","f","cos","setData","velocityLayer","displayValues","displayOptions","velocityType","displayPosition","displayEmptyString","maxVelocity","colorScale","elaneMap","frameRate","opacity","addLayer","_clearWind","setTimeout","_startWindy","callback","show","_forecasttime","_QBBeginTime","getZoom","_hide","hide","clearLayers","remove","v","y"],"mappings":"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"}