From da0d06cb06ef3fc55d88cb4a9a52505ac35c03e6 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 26 三月 2025 15:12:31 +0800
Subject: [PATCH] 走航融合(待完成)

---
 src/model/SatelliteGrid.js |  289 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 273 insertions(+), 16 deletions(-)

diff --git a/src/model/SatelliteGrid.js b/src/model/SatelliteGrid.js
index ddf731f..ad01ca9 100644
--- a/src/model/SatelliteGrid.js
+++ b/src/model/SatelliteGrid.js
@@ -196,11 +196,7 @@
     // 鏍规嵁缁樺埗棰滆壊鏂瑰紡缁樺埗缃戞牸
     let resGridViews;
     if (customColor) {
-      resGridViews = gridMapUtil.drawGridColorCustom(
-        res,
-        gridDataDetail,
-        style.opacity
-      );
+      resGridViews = gridMapUtil.drawGridColorCustom(res, gridDataDetail);
     } else {
       resGridViews = gridMapUtil.drawGridColor(
         res,
@@ -383,8 +379,7 @@
           if (useCustomColor) {
             gridMapUtil.drawGridColorCustom(
               v.lastGridViews,
-              lastGridDataDetail,
-              { opacity, zIndex }
+              lastGridDataDetail
             );
           } else {
             gridMapUtil.drawGridColor(
@@ -399,20 +394,35 @@
     }
   }
 
-  setGridEvent(name, event) {
+  setGridEvent(tags, name, event) {
+    const { _mapViewsList, _gridDataDetailList } = this._getMapViews(...tags);
+
     if (!this.events.has(name)) {
       this.events.set(name, []);
     }
     const list = this.events.get(name);
     if (list.length > 0) {
       const lastEvent = list[list.length - 1];
-      this.mapViews.gridViews.forEach((polygon) => {
-        polygon.off(name, lastEvent);
+      _mapViewsList.forEach((v) => {
+        v.gridViews.forEach((polygon) => {
+          polygon.off(name, lastEvent);
+        });
       });
     }
+
     this.events.get(name).push(event);
-    this.mapViews.gridViews.forEach((polygon) => {
-      polygon.on(name, event);
+    _mapViewsList.forEach((v, i) => {
+      const gridDataDetailList = _gridDataDetailList[i];
+      v.gridViews.forEach((polygon) => {
+        const { gridCell } = polygon.getExtData();
+        const cellIndex = gridCell.cellIndex;
+        const gridDataDetail = gridDataDetailList.find(
+          (v) => v.cellId == cellIndex
+        );
+        polygon.on(name, (e) => {
+          event(gridCell, gridDataDetail);
+        });
+      });
     });
   }
 
@@ -435,18 +445,19 @@
   /**
    * 灏嗗缁勭綉鏍艰繘琛岃瀺鍚�
    * 閲嶅彔鐨勭綉鏍艰繘琛岀洃娴嬫暟鎹潎鍊艰绠楀苟閲嶆柊璁$畻瀵瑰簲棰滆壊锛屽舰鎴愭柊鐨勪竴缁勮瀺鍚堢綉鏍�
-   * @param {...String} tags 闇�瑕佽瀺鍚堢殑缃戞牸鏍囩锛屽綋涓虹┖鏃讹紝榛樿铻嶅悎鎵�鏈夌綉鏍�
+   * @param {Array} tags 闇�瑕佽瀺鍚堢殑缃戞牸鏍囩锛屽綋涓虹┖鏃讹紝榛樿铻嶅悎鎵�鏈夌綉鏍�
    */
-  mixGrid(tags) {
+  mixGrid(tags, isMixGridHighlight) {
     tags.sort((a, b) => {
       return a < b ? -1 : 1;
     });
     const mixTag = tags.join('-');
     if (this.mapViewsMap.has(mixTag)) {
       this.changeVisibility({
-        tag: mixTag,
+        tags: [mixTag],
         showGridViews: true
       });
+      this.changeGridColor({ tag: mixTag, isMixGridHighlight });
     } else {
       // const mixMapViews = this._createNewMapViews();
       // 鏍规嵁鏍囩tag锛岃幏鍙栧搴斿缁勭綉鏍兼暟鎹�
@@ -501,8 +512,13 @@
         data: resGridDataDetail,
         grid: {
           style: {
-            isMixGridHighlight: true
+            isMixGridHighlight:
+              isMixGridHighlight == undefined ? true : isMixGridHighlight
           }
+        },
+        extData: {
+          name: `璧拌埅铻嶅悎 - ${mixTag}`,
+          type: 1
         }
       });
     }
@@ -510,6 +526,247 @@
     return mixTag;
   }
 
+  /**
+   * 缁樺埗鐑姏鍥剧綉鏍�
+   * @param {string} tag
+   */
+  drawHeatGrid(tag) {
+    if (!this.mapViewsMap.has(tag) || !this.gridDataDetailMap.has(tag)) {
+      return;
+    }
+
+    const heatTag = `heat-${tag}`;
+    if (this.mapViewsMap.has(heatTag)) {
+      this.changeVisibility({
+        tags: [heatTag],
+        showGridViews: true
+      });
+    } else {
+      const _mapViews = this.mapViewsMap.get(tag);
+      const _gridDataDetail = this.gridDataDetailMap.get(tag);
+      // const groupId = _gridDataDetail[0].groupId;
+      // const cellId = _gridDataDetail.cellId;
+
+      const originCellIdList = _gridDataDetail.map((v) => v.cellId);
+      let headGridDataDetailList = [];
+
+      const width = 120;
+      const height = 90;
+      const eachwidth = 10;
+      const eachheight = 10;
+
+      const searchLength = 3;
+
+      const _dataMap = new Map();
+
+      _gridDataDetail.forEach((gdd) => {
+        const searchRes = this.search(
+          gdd,
+          width,
+          height,
+          eachwidth,
+          eachheight,
+          searchLength
+        );
+        if (searchRes.find(v=> v.cellId == 1670)) {
+          console.log();
+          
+        }
+        searchRes.forEach((e) => {
+          if (originCellIdList.indexOf(e.cellId) == -1) {
+            if (!_dataMap.has(e.cellId)) {
+              _dataMap.set(e.cellId, {
+                source: [],
+                res: {}
+              });
+            }
+            _dataMap.get(e.cellId).source.push(e);
+          }
+        });
+      });
+
+      _dataMap.forEach((v, k) => {
+        let total = 0,
+          count = v.source.length;
+        v.source.forEach((s) => {
+          total += s.pm25;
+        });
+        v.res = {
+          isHeatData: true,
+          groupId: v.source[0].groupId,
+          cellId: v.source[0].cellId,
+          pm25: count == 0 ? null : Math.round((total / count) * 10) / 10,
+          originData: v.source
+        };
+        headGridDataDetailList.push(v.res);
+      });
+      headGridDataDetailList = headGridDataDetailList.concat(_gridDataDetail);
+
+      // 閲嶆柊鎸夌収鐩戞祴鏁版嵁鎺掑簭骞舵爣璁版帓鍚�
+      headGridDataDetailList.sort((a, b) => {
+        return b.pm25 - a.pm25;
+      });
+      headGridDataDetailList.forEach((gdd, i) => {
+        gdd.rank = i + 1;
+      });
+
+      this.drawTagGrid({
+        tag: heatTag,
+        data: headGridDataDetailList,
+        // grid: {
+        //   style: {
+        //     isMixGridHighlight:
+        //       isMixGridHighlight == undefined ? true : isMixGridHighlight
+        //   }
+        // },
+        extData: {
+          name: `璧拌埅鐑姏鍥� - ${heatTag}`,
+          type: 2
+        }
+      });
+    }
+
+    return heatTag;
+  }
+
+  drawHeatGrid2(tag, headGridDataDetailList) {
+    const heatTag = `heat-${tag}`;
+    if (this.mapViewsMap.has(heatTag)) {
+      this.changeVisibility({
+        tags: [heatTag],
+        showGridViews: true
+      });
+    } else {
+      this.drawTagGrid({
+        tag: heatTag,
+        data: headGridDataDetailList,
+        extData: {
+          name: `璧拌埅鐑姏鍥� - ${heatTag}`,
+          type: 2
+        }
+      });
+    }
+    return heatTag;
+  }
+
+  search(gdd, width, height, eachwidth, eachheight, searchLength) {
+    function getCellWidthRange(cellId, width, height) {
+      const total = width * height;
+      const x = Math.ceil(cellId / total) - 1;
+      let first = 1 + x * total,
+        last = width + x * total;
+
+      let scale = 0;
+      while (scale < height) {
+        const min = first + scale * width;
+        const max = last + scale * width;
+        if (cellId >= min && cellId <= max) {
+          return [min, max];
+        }
+        scale++;
+      }
+    }
+
+    const cellId = gdd.cellId;
+    // const minData = gdd.pm25 / 2
+    const dataOffset = (gdd.pm25 - gdd.pm25 / 2) / 3;
+
+    const hOffset = eachwidth;
+    const wOffset = 1;
+
+    const cellIdMin = 1;
+    const cellIdMax = width * height;
+
+    let searchWidth = 0 - searchLength,
+      searchHeight = 0 - searchLength;
+
+    const result = [];
+
+    const eachRange = getCellWidthRange(cellId, eachwidth, eachheight);
+    const groupRange = getCellWidthRange(
+      Math.ceil(cellId / (eachwidth * eachheight)),
+      width / eachwidth,
+      height / eachheight
+    );
+
+    for (let w = searchWidth; w <= searchLength; w++) {
+      // 鍏堣繘琛屾í鍚戠殑鍧愭爣鍙樻崲
+      let _cellId = cellId + w * wOffset;
+      if (_cellId < eachRange[0] || _cellId > eachRange[1]) {
+        const cellOffset =
+          _cellId < eachRange[0]
+            ? _cellId - eachRange[0]
+            : _cellId - eachRange[1];
+
+        const groupOffset = Math[cellOffset / eachwidth > 0 ? 'ceil' : 'floor'](
+          cellOffset / eachwidth
+        );
+
+        const newEachRange = eachRange.map(
+          (r) => r + groupOffset * eachwidth * eachheight
+        );
+
+        _cellId =
+          groupOffset > 0
+            ? newEachRange[0] + cellOffset - wOffset
+            : newEachRange[1] + cellOffset + wOffset;
+
+        const _groupId = Math.ceil(_cellId / (eachwidth * eachheight));
+
+        if (_groupId < groupRange[0] || _groupId > groupRange[1]) {
+          continue;
+        }
+      }
+
+      for (let h = searchHeight; h <= searchLength; h++) {
+        if (w == 0 && h == 0) continue;
+
+        const _eachRange = getCellWidthRange(_cellId, eachwidth, eachheight);
+        // if (_eachRange == undefined) {
+        //   console.log();
+
+        // }
+        const wOffset = _cellId - _eachRange[0];
+        let _resCellId = _cellId + h * hOffset;
+        if (_resCellId < cellIdMin || _resCellId > cellIdMax) continue;
+
+        const total = eachwidth * eachheight;
+        const x = Math.ceil(_cellId / total) - 1;
+        const eachCellIdMin = 1 + x * total;
+        const eachCellIdMax = total + x * total;
+        const topCell = eachCellIdMin + wOffset;
+        const bottomCell = eachCellIdMax - eachwidth + 1 + wOffset;
+        if (_resCellId < eachCellIdMin || _resCellId > eachCellIdMax) {
+          const cellOffset =
+            _resCellId < eachCellIdMin
+              ? _resCellId - topCell
+              : _resCellId - bottomCell;
+
+          const newTopCell =
+            cellOffset > 0
+              ? topCell + width * eachheight
+              : topCell - width * eachheight;
+          const newBottomCell =
+            cellOffset > 0
+              ? bottomCell + width * eachheight
+              : bottomCell - width * eachheight;
+
+          _resCellId =
+            cellOffset > 0
+              ? newTopCell + cellOffset - hOffset
+              : newBottomCell + cellOffset + hOffset;
+        }
+        result.push({
+          groupId: gdd.groupId,
+          cellId: _resCellId,
+          pm25: gdd.pm25 - Math.max(Math.abs(w), Math.abs(h)) * dataOffset
+        });
+      }
+    }
+
+    return result;
+  }
+
   _getMapViews(...tags) {
     let _mapViewsList = [],
       _gridDataDetailList = [];

--
Gitblit v1.9.3