From 4b275f2093954cc58bbc23e4fc67e67d6fe81c0b Mon Sep 17 00:00:00 2001
From: Riku <risaku@163.com>
Date: 星期日, 13 七月 2025 22:46:35 +0800
Subject: [PATCH] 2025.7.13 污染动态溯源

---
 src/model/Factor.js |   85 +++++++++++++++++++++++++++++++-----------
 1 files changed, 63 insertions(+), 22 deletions(-)

diff --git a/src/model/Factor.js b/src/model/Factor.js
index f142012..5a720c1 100644
--- a/src/model/Factor.js
+++ b/src/model/Factor.js
@@ -1,6 +1,7 @@
 import { Legend } from './Legend';
 
 const _hMap = {
+  19: [0, 1000], //NO
   1: [0, 1000], //NO2
   2: [0, 2000], //CO
   3: [0, 1000], //H2S
@@ -50,6 +51,7 @@
   this.factorId;
   this.heights = []; //3d鍦板浘褰撳墠灞曠ず鍧愭爣鐐瑰搴旂殑楂樺害鏁扮粍
   this.colors = []; // 3d鍦板浘褰撳墠灞曠ず鍧愭爣鐐瑰搴旂殑棰滆壊鏁扮粍
+  this.bottomColors = []; //鏈�灏忓�煎搴旂殑鍥句緥鑹叉暟缁�
   this.bottomColor; //鏈�灏忓�煎搴旂殑鍥句緥鑹�
   this.min = -1; // 褰撳墠鏄剧ず鐨勬渶灏忓��
   this.max = -1; // 褰撳墠鏄剧ず鐨勬渶澶у��
@@ -59,21 +61,32 @@
   this.standardMax = -1; //鐩戞祴鍥犲瓙绫诲瀷瀵瑰簲鐨勬爣鍑嗘渶澶у��
 
   this.legendType = Legend.S_TYPE; //鍥句緥妯″紡
+  // this.legendType = Legend.D_TYPE; //鍥句緥妯″紡
 
-  if (options != undefined) {
-    this.datas = options.datas;
-    this.heights = options.heights;
-    this.min = options.min;
-    this.max = options.max;
-    this.originMin = options.originMin;
-    this.originMax = options.originMax;
+  if (typeof options === 'object') {
+    for (const key in options) {
+      if (Object.prototype.hasOwnProperty.call(options, key)) {
+        const value = options[key];
+        this[key] = value;
+      }
+    }
 
-    this.factorName = options.factorName;
-    this.factorId = options.factorId;
-    this.colors = options.colors;
-    this.bottomColor = options.bottomColor;
-    this.standardMin = options.standardMin;
-    this.standardMax = options.standardMax;
+    // this.datas = options.datas;
+    // this.heights = options.heights;
+    // this.min = options.min;
+    // this.max = options.max;
+    // this.originMin = options.originMin;
+    // this.originMax = options.originMax;
+
+    // this.factorName = options.factorName;
+    // this.factorId = options.factorId;
+    // this.colors = options.colors;
+    // this.bottomColors = options.bottomColors;
+    // this.bottomColor = options.bottomColor;
+    // this.standardMin = options.standardMin;
+    // this.standardMax = options.standardMax;
+
+    // this.legendType = options.legendType;
   }
 }
 
@@ -124,12 +137,12 @@
     this.heights = [];
     this.colors = [];
     this.datas.forEach((d) => {
-      var h = getFactorHeight(d.factorId, d.factorData, [this.min, this.max]);
+      let h = getFactorHeight(d.factorId, d.factorData, [this.min, this.max]);
       if (d.factorData == -1) {
         h = -1;
       }
       this.heights.push(h);
-      var c = Legend.getColor(
+      const c = Legend.getColor(
         this.factorName,
         this.legendType,
         d.factorData,
@@ -137,6 +150,8 @@
         this.max
       );
       this.colors.push(c);
+      const b = Legend.getPreviousColor(this.factorName, this.legendType, c);
+      this.bottomColors.push(b);
       // this.heights.push(d.factorData)
     });
     this.bottomColor = Legend.getColor(
@@ -181,6 +196,7 @@
       originMax: this.originMax,
       factorName: this.factorName,
       colors: this.colors,
+      bottomColors: this.bottomColors,
       bottomColor: this.bottomColor,
       standardMin: this.standardMin,
       standardMax: this.standardMax
@@ -193,24 +209,49 @@
     if (d1 == undefined || d2 == undefined) {
       return;
     }
+    let diffValue = d2.factorData - d1.factorData;
+    // 瀵逛簬椋庡悜鐭㈤噺鏉ヨ锛屽姩鐢荤殑鍙樺寲搴旇浠庝袱涓鍚戝す瑙掕緝灏忕殑閭d竴渚ц繘琛屽彉鍖�
+    if (this.factorName == 'WIND_DIRECTION') {
+      // 椋庡悜瑙掑害宸�
+      if (diffValue > 180) {
+        diffValue -= 360;
+      } else if (diffValue < -180) {
+        diffValue += 360;
+      }
+    }
     // 鍗曞抚鏁版嵁鍊肩殑宸��
-    var dValue = {
-      factorData: (d2.factorData - d1.factorData) / count,
-      physicalQuantity: (d2.physicalQuantity - d2.physicalQuantity) / count
+    const dValue = {
+      factorData: diffValue / count
+      // physicalQuantity: (d2.physicalQuantity - d2.physicalQuantity) / count
+    };
+
+    // 椋庡悜鐭㈤噺淇
+    const correct = (v) => {
+      if (this.factorName == 'WIND_DIRECTION') {
+        if (v < 0) {
+          return 360 + v;
+        } else if (v > 360) {
+          return v - 360;
+        } else {
+          return v;
+        }
+      } else {
+        return v;
+      }
     };
     for (let i = 0; i < count - 1; i++) {
       var _data = {
-        factorData: d1.factorData + dValue.factorData * (i + 1),
+        factorData: correct(d1.factorData + dValue.factorData * (i + 1)),
         factorId: d1.factorId,
         factorName: d1.factorName,
-        physicalQuantity:
-          d1.physicalQuantity + dValue.physicalQuantity * (i + 1),
+        // physicalQuantity:
+        //   d1.physicalQuantity + dValue.physicalQuantity * (i + 1),
         sensorId: d1.sensorId,
         statusList: d1.statusList
       };
       if (!isDraw) {
         _data.factorData = -1;
-        _data.physicalQuantity = -1;
+        // _data.physicalQuantity = -1;
       }
       this.datas.push(_data);
     }

--
Gitblit v1.9.3