riku
2025-03-20 3970cefa60ea7e5d899b7475345b65646c19c110
src/model/SatelliteGrid.js
@@ -10,15 +10,22 @@
  constructor(name) {
    this.name = name;
  }
  // 地图网格相关对象
  // 默认地图网格相关对象
  mapViews;
  mapViewsList = [];
  gridDataDetail;
  infoMap = new Map();
  // 地图网格对象Map结构,存储对应key下的网格对象、网格坐标信息
  mapViewsMap = new Map();
  // 网格数据Map结构,存储对应key下的网格监测数据信息
  gridDataDetailMap = new Map();
  districtPolygon;
  firstEvent;
  events = new Map();
@@ -83,8 +90,6 @@
      }
    }
  }
  firstEvent;
  // 绘制网格线
  drawPolyline(gridInfo, event) {
@@ -166,14 +171,16 @@
    points,
    gridDataDetail,
    lastGridViews,
    opacity,
    zIndex,
    customColor
    customColor,
    style
  }) {
    // 根据数据筛选有数据的网格
    const res = [];
    // 以及对应的中心点坐标
    const pointsRes = [];
    // 网格按照其编号升序排列,然后计算编号和下表的偏差值
    const offset = gridViews[0].getExtData().gridCell.cellIndex - 0;
    gridDataDetail.forEach((d) => {
      // 根据数据关联的网格编号,找到对应网格
      const cellId = d.cellId;
@@ -182,8 +189,8 @@
          '遥测数据的网格索引编号超出网格组范围,数据和网格组可能不对应'
        );
      }
      res.push(gridViews[cellId - 1]);
      pointsRes.push(points[cellId - 1]);
      res.push(gridViews[cellId - offset]);
      pointsRes.push(points[cellId - offset]);
    });
    // 根据绘制颜色方式绘制网格
@@ -192,16 +199,14 @@
      resGridViews = gridMapUtil.drawGridColorCustom(
        res,
        gridDataDetail,
        opacity,
        zIndex
        style.opacity
      );
    } else {
      resGridViews = gridMapUtil.drawGridColor(
        res,
        gridDataDetail,
        'PM25',
        opacity,
        zIndex
        style
      );
    }
@@ -223,167 +228,86 @@
  // 绘制网格遥感数据值和网格颜色
  drawGrid({
    gridDataDetail,
    useCustomColor,
    opacity,
    zIndex,
    showDataTxt,
    showRankTxt,
    useDataTxtColor,
    mapViews
    mapViews,
    data,
    grid = { useCustomColor: false, style: { opacity: 1, zIndex: 11 } },
    dataTxt = { isShow: false, useCustomColor: false, useColor: false },
    rankTxt = { isShow: false }
  }) {
    const _mapViews = mapViews ? mapViews : this.mapViews;
    // SatelliteProxy.clearText(mapViews);
    this.gridDataDetail = data;
    const { resGridViews, pointsRes } = this.drawColor({
      gridViews: _mapViews.gridViews,
      points: _mapViews.points,
      gridDataDetail: gridDataDetail,
      gridDataDetail: data,
      lastGridViews: _mapViews.lastGridViews,
      customColor: useCustomColor,
      opacity: opacity,
      zIndex: zIndex
      customColor: grid.useCustomColor,
      style: grid.style
    });
    _mapViews.lastGridViews = resGridViews;
    _mapViews.lastPoints = pointsRes;
    // 数据标记
    const { textViews: dataTxt, labelsLayer: dataLayer } = this.drawDataText(
    const { textViews: dtv } = this.drawDataText(
      _mapViews.lastPoints,
      gridDataDetail,
      data,
      _mapViews.dataTxt,
      useCustomColor,
      useDataTxtColor
      dataTxt.useCustomColor,
      dataTxt.useColor
    );
    _mapViews.dataTxt = dataTxt;
    _mapViews.dataLayer = dataLayer;
    _mapViews.dataTxt = dtv;
    const { textViews: rankTxt, labelsLayer: rankLayer } = this.drawRankText(
    const { textViews: rtv } = this.drawRankText(
      _mapViews.lastPoints,
      gridDataDetail,
      data,
      _mapViews.rankTxt,
      _mapViews.rankLayer
    );
    _mapViews.rankTxt = rankTxt;
    _mapViews.rankLayer = rankLayer;
    _mapViews.rankTxt = rtv;
    if (showDataTxt) {
    if (dataTxt.isShow) {
      map.add(_mapViews.dataTxt);
    }
    if (showRankTxt) {
    if (rankTxt.isShow) {
      map.add(_mapViews.rankTxt);
    }
  }
  //
  drawGrids({
    gridDataDetailList,
    useCustomColor,
    opacity,
    zIndex,
    showDataTxt,
    showRankTxt
  }) {
    if (this.mapViewsList.length < gridDataDetailList.length) {
      let index = this.mapViewsList.length;
      while (index < gridDataDetailList.length) {
        const newMapViews = {
          gridViews: gridMapUtil.drawPolylines({
            points: this.mapViews.gridPoints,
            event: this.firstEvent
          }),
          gridPoints: JSON.parse(JSON.stringify(this.mapViews.gridPoints)),
          points: JSON.parse(JSON.stringify(this.mapViews.points))
        };
        this.mapViewsList.push(newMapViews);
      }
    }
    this.mapViewsList.forEach((m, i) => {
      this.drawGrid({
        gridDataDetail: gridDataDetailList[i],
        useCustomColor,
        opacity,
        zIndex,
        showDataTxt,
        showRankTxt,
        mapViews: m
      });
    });
  }
  drawNewGrid({
    gridDataDetail,
    useCustomColor,
    opacity,
    zIndex,
    showDataTxt,
    showRankTxt
  }) {
    const newMapViews = {
      gridViews: gridMapUtil.drawPolylines({
        points: this.mapViews.gridPoints,
        event: this.firstEvent
      }),
      gridPoints: JSON.parse(JSON.stringify(this.mapViews.gridPoints)),
      points: JSON.parse(JSON.stringify(this.mapViews.points))
    };
    this.mapViewsList.push(newMapViews);
    this.drawGrid({
      gridDataDetail,
      useCustomColor,
      opacity,
      zIndex,
      showDataTxt,
      showRankTxt,
      mapViews: newMapViews
    });
  }
  drawTagGrid({
    tag,
    gridDataDetail,
    useCustomColor,
    opacity,
    zIndex,
    showDataTxt,
    showRankTxt
  }) {
  /**
   * 根据tag标签,展示已有的网格或绘制一组新的网格
   * @param {Object} param0 {
   * tag, 标签
   * gridDataDetail, 网格数据数组
   * useCustomColor, 是否使用对比色
   * opacity, 透明度,取值[0, 1]
   * zIndex, 地图显示层级
   * showDataTxt, 是否显示数据文本
   * showRankTxt, 是否显示排名文本
   * extData, 自定义额外信息对象
   * }
   */
  drawTagGrid({ tag, data, grid, dataTxt, rankTxt, extData }) {
    if (!this.mapViewsMap.has(tag)) {
      const newMapViews = {
        gridViews: gridMapUtil.drawPolylines({
          points: this.mapViews.gridPoints,
          event: this.firstEvent
        }),
        gridPoints: JSON.parse(JSON.stringify(this.mapViews.gridPoints)),
        points: JSON.parse(JSON.stringify(this.mapViews.points))
      };
      const newMapViews = this._createNewMapViews({ extData });
      this.infoMap.set(tag, extData);
      this.mapViewsMap.set(tag, newMapViews);
      this.gridDataDetailMap.set(tag, data);
    }
    const _mapViews = this.mapViewsMap.get(tag);
    this.drawGrid({
      gridDataDetail,
      useCustomColor,
      opacity,
      zIndex,
      showDataTxt,
      showRankTxt,
      mapViews: _mapViews
      mapViews: _mapViews,
      data,
      grid,
      dataTxt,
      rankTxt
    });
  }
  // 调整各类地图覆盖物的可见性
  changeVisibility({ tag, showGridViews, showDataTxt, showRankTxt }) {
    let _mapViewsList = [];
    if (this.mapViews) {
      _mapViewsList.push(this.mapViews);
    }
    if (tag && this.mapViewsMap.has(tag)) {
      _mapViewsList.push(this.mapViewsMap.get(tag));
    } else {
      this.mapViewsMap.forEach((v) => {
        _mapViewsList.push(v);
      });
    }
  changeVisibility({ tags = [], showGridViews, showDataTxt, showRankTxt }) {
    let { _mapViewsList } = this._getMapViews(...tags);
    if (showGridViews != undefined) {
      if (showGridViews) {
        // map.add(this.mapViews.lastGridViews);
@@ -426,17 +350,8 @@
  }
  changeGridOpacity({ tag, isOpacity, opacityValue }) {
    let _mapViewsList = [];
    if (this.mapViews) {
      _mapViewsList.push(this.mapViews);
    }
    if (tag && this.mapViewsMap.has(tag)) {
      _mapViewsList.push(this.mapViewsMap.get(tag));
    } else {
      this.mapViewsMap.forEach((v) => {
        _mapViewsList.push(v);
      });
    }
    let { _mapViewsList } = tag ? this._getMapViews(tag) : this._getMapViews();
    _mapViewsList.forEach((v) => {
      if (v.lastGridViews) {
        v.lastGridViews.forEach((e) => {
@@ -451,6 +366,37 @@
        });
      }
    });
  }
  changeGridColor({
    tag,
    useCustomColor,
    opacity,
    zIndex,
    isMixGridHighlight
  }) {
    let { _mapViewsList, _gridDataDetailList } = this._getMapViews(tag);
    if (_mapViewsList.length == _gridDataDetailList.length) {
      _mapViewsList.forEach((v, i) => {
        if (v.lastGridViews) {
          const lastGridDataDetail = _gridDataDetailList[i];
          if (useCustomColor) {
            gridMapUtil.drawGridColorCustom(
              v.lastGridViews,
              lastGridDataDetail,
              { opacity, zIndex }
            );
          } else {
            gridMapUtil.drawGridColor(
              v.lastGridViews,
              lastGridDataDetail,
              'PM25',
              { opacity, zIndex, isMixGridHighlight }
            );
          }
        }
      });
    }
  }
  setGridEvent(name, event) {
@@ -485,4 +431,120 @@
      });
    }
  }
  /**
   * 将多组网格进行融合
   * 重叠的网格进行监测数据均值计算并重新计算对应颜色,形成新的一组融合网格
   * @param {...String} tags 需要融合的网格标签,当为空时,默认融合所有网格
   */
  mixGrid(tags) {
    tags.sort((a, b) => {
      return a < b ? -1 : 1;
    });
    const mixTag = tags.join('-');
    if (this.mapViewsMap.has(mixTag)) {
      this.changeVisibility({
        tag: mixTag,
        showGridViews: true
      });
    } else {
      // const mixMapViews = this._createNewMapViews();
      // 根据标签tag,获取对应多组网格数据
      let { _gridDataDetailList } = this._getMapViews(...tags);
      const _dataMap = new Map();
      // 将每组每个网格数据按照网格编号进行分类,相同网格的数组归集至一起
      _gridDataDetailList.forEach((list) => {
        list.forEach((gdd) => {
          if (!_dataMap.has(gdd.cellId)) {
            _dataMap.set(gdd.cellId, {
              source: [],
              res: {}
            });
          }
          _dataMap.get(gdd.cellId).source.push(gdd);
        });
      });
      // 计算每个网格下的数据均值
      const resGridDataDetail = [];
      _dataMap.forEach((v, k) => {
        let total = 0,
          count = v.source.length;
        v.source.forEach((s) => {
          total += s.pm25;
        });
        v.res = {
          isMixData: true,
          groupId: v.source[0].groupId,
          cellId: v.source[0].cellId,
          pm25: count == 0 ? null : Math.round((total / count) * 10) / 10,
          originData: v.source
        };
        // 数据量超过1个时,表明该网格数据是融合的,展示高亮的样式
        if (count > 1) {
          v.res.gridStyle = {
            strokeWeight: 2,
            strokeColor: 'blue'
          };
        }
        resGridDataDetail.push(v.res);
      });
      // 重新按照监测数据排序并标记排名
      resGridDataDetail.sort((a, b) => {
        return b.pm25 - a.pm25;
      });
      resGridDataDetail.forEach((gdd, i) => {
        gdd.rank = i + 1;
      });
      this.drawTagGrid({
        tag: mixTag,
        data: resGridDataDetail,
        grid: {
          style: {
            isMixGridHighlight: true
          }
        }
      });
    }
    return mixTag;
  }
  _getMapViews(...tags) {
    let _mapViewsList = [],
      _gridDataDetailList = [];
    if (tags.length > 0) {
      tags.forEach((tag) => {
        if (this.mapViewsMap.has(tag) && this.gridDataDetailMap.has(tag)) {
          _mapViewsList.push(this.mapViewsMap.get(tag));
          _gridDataDetailList.push(this.gridDataDetailMap.get(tag));
        }
      });
    } else {
      this.mapViewsMap.forEach((v) => {
        _mapViewsList.push(v);
      });
      this.gridDataDetailMap.forEach((v) => {
        _gridDataDetailList.push(v);
      });
      if (this.mapViews && this.gridDataDetail) {
        _mapViewsList.push(this.mapViews);
        _gridDataDetailList.push(this.gridDataDetail);
      }
    }
    return { _mapViewsList, _gridDataDetailList };
  }
  _createNewMapViews({ extData }) {
    return {
      gridViews: gridMapUtil.drawPolylines({
        points: this.mapViews.gridPoints,
        event: this.firstEvent
      }),
      gridPoints: JSON.parse(JSON.stringify(this.mapViews.gridPoints)),
      points: JSON.parse(JSON.stringify(this.mapViews.points)),
      extData
    };
  }
}