{"version":3,"file":"TyphoonService.mjs","sources":["../../../../../../../packages/sdk/plugins/weather/Typhoon/TyphoonService.ts"],"sourcesContent":["import { toRaw, unref } from 'vue'\nimport L from 'leaflet'\nimport { sortBy } from 'lodash-unified'\nimport { ShipxyOptions } from '@map-sdk/sdk/config'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { createTFQ } from '@map-sdk/sdk/plugins/weather/Typhoon/TFQ'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\nimport type { TFQ } from '@map-sdk/sdk/plugins/weather/Typhoon/TFQ'\nimport type { LatLngExpression, LeafletMouseEvent } from 'leaflet'\n\n// 可能的TyphoonDetails类型定义\nexport interface TyphoonDetails {\n  chnname: string // 台风的中文名称\n  enname: string // 台风的英文名称\n}\n\nexport interface TyphoonConfiguration {\n  typhoonLayer: L.LayerGroup // 台风相关所有图层的集合\n  actualLayer: L.LayerGroup // 实际路径图层\n  forecastLayer: L.LayerGroup // 预测路径图层\n  currNodeLayer: L.LayerGroup<L.Circle | L.Marker> // 当前节点（台风眼）图层\n  chnname: string // 台风中文名\n  enname: string // 台风英文名\n  // 可能还有其他配置属性\n}\n\nexport interface PathPoint {\n  id: string\n  time: number\n  latlng: L.LatLng\n  windspeed: number\n  windpower: number\n  pressure: number\n  direction: string\n  speed: number\n  radius_7?: number\n  radius_10?: number\n  radius_7_s: string\n  radius_10_s: string\n  isforecast: boolean\n  provider: string\n  forecasts?: PathPoint[]\n}\n\n// 类型定义\nexport interface DegRadiusInfo {\n  deg: number\n  radius: number\n}\n\nexport interface ArcInfo {\n  radius: number\n  startAngle: number\n  endAngle: number\n  real: [number, number] // 原始角度范围\n  clockwise: boolean\n}\nlet LayerMap: MyMap\nconst _typhoonLayers: TyphoonConfiguration[] = [] // 存储台风图层配置的数组\n\n// 创建一个新的台风配置对象\nlet layer: TyphoonConfiguration = {\n  // 初始化各个图层组（Leaflet 图层）\n  typhoonLayer: L.layerGroup(),\n  actualLayer: L.layerGroup(),\n  forecastLayer: L.layerGroup(),\n  currNodeLayer: L.layerGroup(),\n  chnname: 'typhoonInfo.chnname',\n  enname: 'typhoonInfo.enname',\n}\n/**\n * 绘制台风服务\n */\nexport class TyphoonService {\n  private _map: MyMap // Leaflet 地图实例\n  private options: {\n    autoLocation: boolean // 是否自动定位到台风\n    showTimeTip: boolean // 是否显示时间提示\n    showTimeTipMinZoom: number // 显示时间提示的最小缩放级别\n  }\n\n  constructor(map: MyMap, options?: any) {\n    LayerMap = toRaw(unref(map))\n    this._map = map\n    this.options = {\n      autoLocation: true,\n      showTimeTip: true,\n      showTimeTipMinZoom: 2,\n    }\n    L.Util.extend(this.options, options) // 合并用户自定义选项\n    LayerMap.on('zoomend', this.showTimeTipByZoom, this) // 当地图缩放级别改变时触发事件\n  }\n\n  /**\n   * 根据当前地图缩放级别决定是否显示时间提示\n   *\n   * @private\n   */\n  private showTimeTipByZoom() {\n    let shouldShowTimeTip = false\n\n    if (this.options.showTimeTip) {\n      const currentZoomLevel = this._map.getZoom()\n      shouldShowTimeTip = currentZoomLevel >= this.options.showTimeTipMinZoom\n\n      for (const typhoonLayerConfig of _typhoonLayers) {\n        if (typhoonLayerConfig) {\n          const mainLayer =\n            typhoonLayerConfig.currNodeLayer.getLayers()[0] as any\n          // 获取台风当前位置经纬度\n          let layerLatLng: any =\n            'getLatLng' in mainLayer\n              ? mainLayer.getLatLng()\n              : mainLayer.getLatLngs()\n          // 处理实际路径与预测路径上的点，并根据距离决定是否显示提示框\n          const layers = [\n            typhoonLayerConfig.actualLayer,\n            typhoonLayerConfig.forecastLayer,\n          ]\n          const map = this._map\n          layers.forEach((layerGroup) => {\n            layerGroup.getLayers().forEach((item: any) => {\n              if (item.options.bindTooltip) {\n                if (shouldShowTimeTip) {\n                  let isCloseEnough = false\n                  const distanceXY = CanvasShipUtils.getDistanceXYByLatlngs(\n                    map,\n                    Array.isArray(layerLatLng) ? layerLatLng[0] : layerLatLng,\n                    item.getLatLng()\n                  )\n                  if (distanceXY.x >= 100 || distanceXY.y >= 26) {\n                    isCloseEnough = true\n                    layerLatLng = item.getLatLng()\n                  }\n                  item[isCloseEnough ? 'openTooltip' : 'closeTooltip']()\n                } else {\n                  item.closeTooltip()\n                }\n              }\n            })\n          })\n        }\n      }\n    }\n  }\n\n  showTyphoon(\n    dataList: PathPoint[],\n    typhoonInfo: TyphoonDetails\n  ): TyphoonConfiguration {\n    // 将传入的台风数据列表复制一份\n    // 按照时间戳对台风数据进行升序排列\n    const typhoons = sortBy(dataList, (o) => o.time)\n    layer = {\n      // 初始化各个图层组（Leaflet 图层）\n      typhoonLayer: L.layerGroup(),\n      actualLayer: L.layerGroup(),\n      forecastLayer: L.layerGroup(),\n      currNodeLayer: L.layerGroup(),\n      chnname: typhoonInfo.chnname,\n      enname: typhoonInfo.enname,\n    }\n\n    // 如果有台风数据\n    if (typhoons && typhoons.length) {\n      // 将新配置对象添加到台风图层列表中\n      _typhoonLayers.push(layer)\n      console.log(_typhoonLayers)\n\n      // 将整个台风图层组添加到地图上\n      LayerMap.addLayer(layer.typhoonLayer)\n\n      // 获取台风数据列表中的最后一个数据项索引作为默认展示节点\n      const defaultIndex = typhoons.length - 1\n\n      // 绘制当前节点\n      this._drawCurrNode(typhoons, defaultIndex, layer)\n\n      // 绘制实际路径线\n      this._drawActualLine(typhoons, defaultIndex, layer)\n\n      // 绘制预测路径线\n      this._drawForecastLine(typhoons, defaultIndex, layer)\n\n      // 如果设置为自动定位，则调整地图视图至台风最新位置，并限制最大缩放级别为 5\n      if (this.options.autoLocation) {\n        let zoom = this._map.getZoom()\n        if (zoom > 5) {\n          zoom = 5\n        }\n        this._map.setView(typhoons[defaultIndex].latlng, zoom)\n      }\n\n      // 更新时间提示信息\n      this.showTimeTipByZoom()\n    }\n    // 返回已添加到地图上的台风配置对象\n    return layer\n  }\n  /**\n   * 隐藏台风\n   * @param type\n   * @returns\n   */\n  hideTyphoon(type: 'all' | any) {\n    if ('all' == type) {\n      _typhoonLayers.forEach((item) => {\n        item.typhoonLayer.clearLayers()\n      })\n      return\n    }\n    console.log(layer.typhoonLayer, type)\n    type.typhoonLayer.clearLayers()\n  }\n  /**\n   * 数据转换\n   * @param resData\n   * @returns\n   */\n  public parseRawTyphoon(resData: any) {\n    const directionTextMap: { [key: string]: string } = {\n      E: '东',\n      W: '西',\n      S: '南',\n      N: '北',\n      NE: '东北',\n      NW: '西北',\n      SW: '西南',\n      SE: '东南',\n      ENE: '东北偏东',\n      NNE: '东北偏北',\n      NNW: '西北偏北',\n      WNW: '西北偏西',\n      WSW: '西南偏西',\n      SSW: '西南偏南',\n      SSE: '东南偏南',\n      ESE: '东南偏东',\n    }\n\n    const parseTimeString = (time: string): number => {\n      time += ''\n      const year = Number.parseInt(time.slice(0, 4))\n      const month = Number.parseInt(time.slice(4, 6)) - 1\n      const day = Number.parseInt(time.slice(6, 8))\n      const hour = Number.parseInt(time.slice(8, 10))\n      return new Date(year, month, day, hour + 8).getTime() / 1000\n    }\n\n    const parsedDataList: any[] = []\n    const dataByTime: { [key: string]: any } = {}\n    const processedData = CanvasShipUtils.objFrom180(resData, '', 0)\n\n    for (const item of processedData) {\n      let dataByTimeItem: PathPoint = dataByTime[item.time]\n\n      if (!dataByTimeItem) {\n        dataByTimeItem = {} as any\n        dataByTime[item.time] = dataByTimeItem\n        parsedDataList.push(dataByTimeItem)\n      }\n\n      const latLng = L.latLng(\n        Number.parseFloat(`${item.lat}`),\n        Number.parseFloat(`${item.lon}`)\n      )\n\n      if (item.forecast) {\n        const forecastItem: PathPoint = {\n          isforecast: true,\n          provider: item.forecast,\n          time: parseTimeString(item.time) + 3600 * Number.parseInt(item.fhour),\n          latlng: latLng,\n          id: item.id,\n          windpower: item.grade,\n          windspeed: item.mspeed,\n          pressure: item.pressure,\n          speed: item.kspeed,\n          direction: directionTextMap[item.direction] || item.direction,\n          radius_7: item.radius7,\n          radius_10: item.radius10,\n          radius_7_s: item.radius7_s,\n          radius_10_s: item.radius10_s,\n        }\n        if (!dataByTimeItem.forecasts) {\n          dataByTimeItem.forecasts = []\n        }\n        dataByTimeItem.forecasts.push(forecastItem)\n      } else {\n        dataByTimeItem.time = parseTimeString(item.time)\n        dataByTimeItem.latlng = latLng\n        dataByTimeItem.id = item.id\n        dataByTimeItem.windpower = item.grade\n        dataByTimeItem.windspeed = item.mspeed\n        dataByTimeItem.pressure = item.pressure\n        dataByTimeItem.speed = item.kspeed\n        dataByTimeItem.direction =\n          directionTextMap[item.direction] || item.direction\n        dataByTimeItem.radius_7 = item.radius7\n        dataByTimeItem.radius_10 = item.radius10\n        dataByTimeItem.radius_7_s = item.radius7_s\n        dataByTimeItem.radius_10_s = item.radius10_s\n      }\n    }\n\n    return parsedDataList\n  }\n  private _drawActualLine(\n    lines: PathPoint[],\n    actualIndex: number,\n    layer: TyphoonConfiguration\n  ): void {\n    const length = lines.length\n\n    for (let i = 0; i < length; i++) {\n      const line = lines[i]\n      const time = new Date(line.time)\n\n      if (i <= length - 2) {\n        const latlngs: LatLngExpression[] = [line.latlng, lines[i + 1].latlng]\n        layer.actualLayer.addLayer(\n          L.polyline(latlngs, {\n            pane: 'markerPane',\n            color: this._getColor(lines[i + 1].windpower),\n            weight: 2,\n          })\n        )\n      }\n\n      const color = this._getColor(line.windpower)\n      if (i !== actualIndex) {\n        const html = `<div class=\"box\"><div class=\"field\">${CommUtils.dataFormat(\n          time,\n          'MM月DD日 hh时'\n        )}</div></div>`\n        layer.actualLayer.addLayer(\n          L.circleMarker(line.latlng, {\n            color,\n            weight: 1,\n            fill: true,\n            fillColor: color,\n            fillOpacity: 1,\n            radius: 4,\n            pane: 'markerPane',\n            bindTooltip: true,\n          } as any).bindTooltip(html, {\n            className: 'e-tooltip b-fff-b0',\n            direction: 'right',\n            offset: [6, 0],\n            permanent: true,\n            sticky: true,\n          })\n        )\n      }\n\n      const circleMarker = L.circleMarker(line.latlng, {\n        color,\n        weight: 1,\n        fill: true,\n        fillColor: color,\n        fillOpacity: 0,\n        radius: 10,\n        opacity: 0,\n        pane: 'markerPane',\n        ext: i,\n      } as any)\n\n      const html1 = `\n        <div class=\"weather-typh-tooltip\">\n          <div class=\"title\">${layer.chnname}(${\n        layer.enname || layer.chnname\n      })</div>\n          <div class=\"field\"> 时间：${CommUtils.dataFormat(\n            time,\n            'YYYY年MM月DD日 hh时'\n          )}</div>\n          <div class=\"field\"> 纬度：${CanvasShipUtils.latFormatter(\n            line.latlng.lat\n          )}</div>\n          <div class=\"field\"> 经度：${CanvasShipUtils.lngFormatter(\n            line.latlng.lng\n          )}</div>\n          <div class=\"field\"> 风速：${line.windspeed} 米/ 秒</div>\n          <div class=\"field\"> 风力：${line.windpower} 级</div>\n          <div class=\"field\"> 气压：${line.pressure} 百帕</div>\n          <div class=\"field\"> 移向：${line.direction}</div>\n          <div class=\"field\"> 移速：${line.speed}千米/时</div>\n          <div class=\"field\"> 七级半径：${\n            line.radius_7 ? `${line.radius_7}千米` : '--'\n          }</div>\n          <div class=\"field\" style=\"padding-bottom: 10px;\">十级半径：${\n            line.radius_10 ? `${line.radius_10}千米` : '--'\n          }</div>\n        </div>\n      `\n      circleMarker.bindTooltip(html1, {\n        direction: 'right',\n        offset: [15, 0],\n        className: 'weather-typh-bindTooltip',\n      })\n\n      circleMarker.on('click', (e: LeafletMouseEvent) => {\n        layer.currNodeLayer.remove()\n        layer.currNodeLayer.clearLayers()\n        this._drawCurrNode(lines, e.target.options.ext, layer, true)\n        layer.actualLayer.clearLayers()\n        layer.actualLayer.remove()\n        this._drawActualLine(lines, e.target.options.ext, layer)\n        layer.forecastLayer.clearLayers()\n        layer.forecastLayer.remove()\n        this._drawForecastLine(lines, e.target.options.ext, layer)\n        this.showTimeTipByZoom()\n      })\n\n      layer.actualLayer.addLayer(circleMarker)\n    }\n\n    layer.typhoonLayer.addLayer(layer.actualLayer)\n  }\n  private _drawForecastLine(\n    lines: PathPoint[],\n    ext: number,\n    layer: TyphoonConfiguration\n  ): void {\n    const nowLineLatlng = lines[ext].latlng\n    if (lines[ext].forecasts) {\n      const forecasts = lines[ext].forecasts as any\n      if (forecasts.length > 0) {\n        const sortLinesLatlng = forecasts.sort(\n          (a: { time: number }, b: { time: number }) => a.time - b.time\n        )\n\n        for (let i = 0; i < sortLinesLatlng.length; i++) {\n          const item = sortLinesLatlng[i]\n          const time = new Date(item.time)\n          const color = this._getColor(item.windpower)\n\n          let latlngs: LatLngExpression[] = []\n          if (i === 0) {\n            latlngs = [nowLineLatlng, item.latlng]\n          } else {\n            latlngs = [sortLinesLatlng[i - 1].latlng, item.latlng]\n          }\n\n          layer.forecastLayer.addLayer(\n            L.polyline(latlngs, {\n              color,\n              weight: 2,\n              dashArray: '10, 5',\n              dashOffset: '1',\n              pane: 'markerPane',\n            })\n          )\n\n          const circleMarker = L.circleMarker(item.latlng, {\n            color,\n            weight: 1,\n            fill: true,\n            fillColor: color,\n            fillOpacity: 1,\n            radius: 4,\n            pane: 'markerPane',\n            bindTooltip: true,\n            ext: i,\n          } as any)\n\n          const html = `<div class=\"box\"><div class=\"field\">${CommUtils.dataFormat(\n            time,\n            'MM月DD日 hh时'\n          )}</div></div>`\n          circleMarker.bindTooltip(html, {\n            className: 'e-tooltip b-fff-b0',\n            direction: 'right',\n            offset: [6, 0],\n            permanent: true,\n            sticky: true,\n          })\n\n          const circleMarker1 = L.circleMarker(item.latlng, {\n            color,\n            weight: 1,\n            fill: true,\n            fillColor: color,\n            fillOpacity: 1,\n            radius: 4,\n            pane: 'markerPane',\n          })\n\n          let html1 = '中央台'\n          if ('BABJ' !== item.provider) {\n            html1 = '其他'\n          }\n          console.log(layer)\n          const html2 = `\n            <div class=\"weather-typh-tooltip\">\n              <div class=\"title\">${layer.chnname}(${\n            layer.enname || layer.chnname\n          })</div>\n              <div class=\"field\">预报台：${html1}</div>\n              <div class=\"field\">时间：${CommUtils.dataFormat(\n                time,\n                'YYYY年MM月DD日 hh时'\n              )}</div>\n              <div class=\"field\">纬度：${CanvasShipUtils.latFormatter(\n                item.latlng.lat\n              )}</div>\n              <div class=\"field\">经度：${CanvasShipUtils.lngFormatter(\n                item.latlng.lng\n              )}</div>\n              <div class=\"field\">风速：${item.windspeed}米/秒</div>\n              <div class=\"field\">风力：${item.windpower}级</div>\n              <div class=\"field\" style=\"padding-bottom: 10px;\">气压：${\n                item.pressure\n              }百帕</div>\n            </div>\n          `\n\n          circleMarker1.bindTooltip(html2, {\n            direction: 'right',\n            offset: [15, 0],\n            className: 'weather-typh-bindTooltip',\n          })\n\n          const toolTip = circleMarker1.getTooltip() as any\n          if (toolTip) {\n            toolTip._initLayout()\n            toolTip._container.style.padding = '0'\n            toolTip._container.style.border = 'none'\n          }\n\n          layer.forecastLayer.addLayer(circleMarker)\n          layer.forecastLayer.addLayer(circleMarker1)\n        }\n\n        layer.typhoonLayer.addLayer(layer.forecastLayer)\n      }\n    }\n  }\n  private _drawCurrNode(\n    lines: PathPoint[],\n    ext: number,\n    layer: TyphoonConfiguration,\n    isTimeout?: boolean\n  ) {\n    // 声明并初始化常量\n    const nowLine = lines[ext] as any\n    const nowLineTime = new Date(nowLine.time)\n    const defaultConfig: L.TooltipOptions = {\n      className: 'e-tooltip',\n      direction: 'right',\n      offset: [12, 0],\n      permanent: false,\n      sticky: true,\n    }\n\n    // 绘制风圈\n    const drawWindCircle = (radiusKey: string, color: string) => {\n      const radiusS = nowLine[radiusKey]\n      const isRadiusNumeric = /^[0-9]+$/.test(radiusS)\n\n      let circle: L.Circle | TFQ\n      let html: string\n\n      if (isRadiusNumeric) {\n        const radius = 1000 * nowLine[radiusKey.replace('_s', '')]\n\n        circle = L.circle(nowLine.latlng, {\n          pane: 'markerPane',\n          color,\n          weight: 2,\n          fillColor: color,\n          fillOpacity: 0.5,\n          radius,\n          className: radiusKey,\n        })\n        html = `\n        <div class=\"box\">\n          <div class=\"field\">${radiusKey\n            .replace('_s', '级')\n            .replace('radius_', '')}风圈</div>\n          <div class=\"field\">半径：${radius ? `${radius}千米` : '--'}</div>\n        </div>\n      `\n      } else {\n        const directions = ['东北', '西北', '西南', '东南']\n        const radiusValues = radiusS.split(',')\n        const deg = ['45:', '135:', '225:', '315:']\n          .map((dir, i) => dir + radiusValues[i])\n          .join('|')\n        const arcs = this._getArcs(deg)\n\n        circle = createTFQ(nowLine.latlng, arcs, {\n          color,\n          className: radiusKey,\n        })\n        html = `\n        <div class=\"box\">\n          <div class=\"field\">${radiusKey\n            .replace('_s', '级')\n            .replace('radius_', '')}风圈</div>\n          ${radiusValues\n            .map(\n              (val: any, i: number) =>\n                `<div class=\"field\">${directions[i]}：${\n                  val ? `${val}千米` : '--'\n                }</div>`\n            )\n            .join('')}\n        </div>\n      `\n      }\n\n      circle.bindTooltip(html, defaultConfig)\n      layer.currNodeLayer.addLayer(circle)\n\n      return circle\n    }\n\n    // 绘制7级风圈\n    if (nowLine.radius_7) {\n      drawWindCircle('radius_7_s', '#D8D243')\n    }\n\n    // 绘制10级风圈\n    if (nowLine.radius_10) {\n      drawWindCircle('radius_10_s', '#E59851')\n    }\n\n    // 绘制台风中心点\n    const circleMarker = L.circle(nowLine.latlng, {\n      pane: 'markerPane',\n      radius: 0,\n    })\n    const circleMarkerHtml = `\n    <div class=\"box\">\n      <div class=\"field\">${layer.chnname}(${CommUtils.dataFormat(\n      nowLineTime,\n      'MM月DD日 hh时'\n    )})</div>\n    </div>\n  `\n    defaultConfig.permanent = false\n    circleMarker.bindTooltip(circleMarkerHtml, defaultConfig)\n    layer.currNodeLayer.addLayer(circleMarker)\n\n    // 绘制台风图标\n    const marker = L.marker(nowLine.latlng, {\n      icon: L.icon({\n        iconUrl: ShipxyOptions.weather.rotate,\n        iconSize: [32, 32],\n        iconAnchor: [17, 17],\n      }),\n      bubblingMouseEvents: true,\n      pane: 'markerPane',\n      zIndexOffset: 99999999,\n    })\n\n    const markerHtml = `\n    <div class=\"weather-typh-tooltip\">\n      <div class=\"title\">${layer.chnname}(${\n      layer.enname || layer.chnname\n    })</div>\n      <div class=\"field\"> 时间：${CommUtils.dataFormat(\n        nowLineTime,\n        'YYYY年MM月DD日 hh时'\n      )}</div>\n      <div class=\"field\">纬度 ：${CanvasShipUtils.latFormatter(\n        nowLine.latlng.lat\n      )}</div>\n      <div class=\"field\">经度：${CanvasShipUtils.lngFormatter(\n        nowLine.latlng.lng\n      )}</div>\n      <div class=\"field\">风速：${nowLine.windspeed}米/秒</div>\n      <div class=\"field\">风力：${nowLine.windpower}级</div>\n      <div class=\"field\">气压：${nowLine.pressure}百帕</div>\n      <div class=\"field\">移向：${nowLine.direction}</div>\n      <div class=\"field\">移速：${nowLine.speed}千米/时</div>\n      <div class=\"field\">七级半径：${\n        nowLine.radius_7 ? `${nowLine.radius_7}千米` : '--'\n      }</div>\n      <div class=\"field\" style=\"padding-bottom: 10px;\">十级半径：${\n        nowLine.radius_10 ? `${nowLine.radius_10}千米` : '--'\n      }</div>\n    </div>\n  `\n    marker.bindTooltip(markerHtml, {\n      direction: 'right',\n      offset: [15, 0],\n      className: 'weather-typh-bindTooltip',\n    })\n    layer.currNodeLayer.addLayer(marker)\n    layer.typhoonLayer.addLayer(layer.currNodeLayer)\n\n    console.log(layer, 'layer')\n    // 鼠标悬停时自动打开tooltip\n    if (isTimeout) {\n      setTimeout(() => {\n        marker.openTooltip()\n      }, 200)\n    }\n  }\n  _getArcs(degStr: string): ArcInfo[] {\n    const arcs: ArcInfo[] = []\n    let degRadius: DegRadiusInfo[] = []\n\n    degStr &&\n      degStr.split('|').forEach((item) => {\n        const items = item.split(':')\n        degRadius.push({\n          deg: Number(items[0]),\n          radius: Number(items[1]),\n        })\n      })\n\n    degRadius.sort((a, b) => a.deg - b.deg)\n\n    if (\n      degRadius.length === 2 &&\n      degRadius[0].deg === 180 &&\n      degRadius[1].deg === 360\n    ) {\n      degRadius = [\n        { deg: 45, radius: degRadius[1].radius },\n        { deg: 180, radius: degRadius[0].radius },\n        { deg: 315, radius: degRadius[1].radius },\n      ]\n    }\n\n    degRadius.forEach((item) => {\n      if (item.radius >= 0) {\n        let arc: ArcInfo\n        if (arcs.length === 0) {\n          arc = {\n            radius: 1000 * item.radius,\n            startAngle: this._turnDeg(0),\n            endAngle: this._turnDeg(2 * item.deg),\n            real: [0, 2 * item.deg],\n            clockwise: false,\n          }\n        } else {\n          const beforeItem = arcs[arcs.length - 1]\n          let real = beforeItem.real[1] + 2 * (item.deg - beforeItem.real[1])\n          real > 360 && (real = 360)\n          arc = {\n            radius: 1000 * item.radius,\n            startAngle: beforeItem.endAngle,\n            endAngle: beforeItem.endAngle + (real - beforeItem.real[1]),\n            real: [beforeItem.real[1], real],\n            clockwise: false,\n          }\n        }\n        arcs.push(arc)\n      }\n    })\n\n    return arcs\n  }\n  _turnDeg(deg: number): number {\n    return deg - 90\n  }\n\n  _getColor(power: number) {\n    if (power >= 16) return '#AD00D8'\n    switch (power * 1) {\n      case 6:\n      case 7:\n        return '#076DEB'\n      case 8:\n      case 9:\n        return '#FEF301'\n      case 10:\n      case 11:\n        return '#FC8F2B'\n      case 12:\n      case 13:\n        return '#FE0405'\n      case 14:\n      case 15:\n        return '#FE3BA3'\n      default:\n        return '#f6f200'\n    }\n  }\n}\n"],"names":["M","_","h","typhoonLayer","c","layerGroup","actualLayer","forecastLayer","currNodeLayer","chnname","enname","TyphoonService","constructor","r","n","F","x","this","_map","options","autoLocation","showTimeTip","showTimeTipMinZoom","Util","extend","on","showTimeTipByZoom","getZoom","e","s","getLayers","a","getLatLng","getLatLngs","o","t","forEach","i","l","bindTooltip","p","d","f","getDistanceXYByLatlngs","Array","isArray","y","closeTooltip","showTyphoon","E","time","length","push","addLayer","_drawCurrNode","_drawActualLine","_drawForecastLine","setView","latlng","hideTyphoon","clearLayers","parseRawTyphoon","W","S","N","NE","NW","SW","SE","ENE","NNE","NNW","WNW","WSW","SSW","SSE","ESE","Number","parseInt","slice","Date","getTime","objFrom180","latLng","parseFloat","lat","lon","forecast","isforecast","provider","fhour","id","windpower","grade","windspeed","mspeed","pressure","speed","kspeed","direction","radius_7","radius7","radius_10","radius10","radius_7_s","radius7_s","radius_10_s","radius10_s","forecasts","polyline","pane","color","_getColor","weight","dataFormat","circleMarker","fill","fillColor","fillOpacity","radius","className","offset","permanent","sticky","opacity","ext","latFormatter","lngFormatter","lng","remove","target","sort","dashArray","dashOffset","w","m","g","L","T","u","getTooltip","_initLayout","_container","style","padding","border","$","test","v","replace","circle","k","split","D","map","b","join","C","_getArcs","A","marker","icon","iconUrl","P","weather","rotate","iconSize","iconAnchor","bubblingMouseEvents","zIndexOffset","setTimeout","openTooltip","deg","startAngle","_turnDeg","endAngle","real","clockwise"],"mappings":"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"}