Koishi 3 місяців тому
батько
коміт
d8f663375c

+ 132 - 0
src/assets/weatherJson/level.json

@@ -0,0 +1,132 @@
+{
+    "0.01_mb": "0.01毫巴",
+    "0-0.1_m_below_ground": "地面以下0-0.1米",
+    "0.02_mb": "0.02毫巴",
+    "0.04_mb": "0.04毫巴",
+    "0.07_mb": "0.07毫巴",
+    "0.1-0.4_m_below_ground": "地面以下0.1-0.4米",
+    "0.1_mb": "0.1毫巴",
+    "0.2_mb": "0.2毫巴",
+    "0.33-1_sigma_layer": "0.33-1 sigma层",
+    "0.4-1_m_below_ground": "地面以下0.4-1米",
+    "0.44-0.72_sigma_layer": "0.44-0.72 sigma层",
+    "0.44-1_sigma_layer": "0.44-1 sigma层",
+    "0.4_mb": "0.4毫巴",
+    "0.72-0.94_sigma_layer": "0.72-0.94 sigma层",
+    "0.7_mb": "0.7毫巴",
+    "0.995_sigma_level": "0.995 sigma层",
+    "0C_isotherm": "0摄氏度等温线",
+    "1000_m_above_ground": "地面以上1000米",
+    "1000_mb": "1000毫巴",
+    "100_m_above_ground": "地面以上100米",
+    "100_mb": "100毫巴",
+    "10_m_above_ground": "地面以上10米",
+    "10_m_above_mean_sea_level": "平均海平面以上10米",
+    "10_mb": "10毫巴",
+    "120-90_mb_above_ground": "地面以上120-90毫巴",
+    "125_mb": "125毫巴",
+    "1-2_m_below_ground": "地面以下1-2米",
+    "150-120_mb_above_ground": "地面以上150-120毫巴",
+    "150_mb": "150毫巴",
+    "15_mb": "15毫巴",
+    "175_mb": "175毫巴",
+    "180-0_mb_above_ground": "地面以上180-0毫巴",
+    "180-150_mb_above_ground": "地面以上180-150毫巴",
+    "1829_m_above_mean_sea_level": "平均海平面以上1829米",
+    "1_hybrid_level": "1混合层",
+    "1_mb": "1毫巴",
+    "200_mb": "200毫巴",
+    "20_m_above_ground": "地面以上20米",
+    "20_mb": "20毫巴",
+    "225_mb": "225毫巴",
+    "250_mb": "250毫巴",
+    "255-0_mb_above_ground": "地面以上255-0毫巴",
+    "2743_m_above_mean_sea_level": "平均海平面以上2743米",
+    "275_mb": "275毫巴",
+    "2_hybrid_level": "2混合层",
+    "2_m_above_ground": "地面以上2米",
+    "2_mb": "2毫巴",
+    "3000-0_m_above_ground": "地面以上3000-0米",
+    "300_mb": "300毫巴",
+    "30-0_mb_above_ground": "地面以上30-0毫巴",
+    "305_m_above_mean_sea_level": "平均海平面以上305米",
+    "30_m_above_ground": "地面以上30米",
+    "30_mb": "30毫巴",
+    "325_mb": "325毫巴",
+    "350_mb": "350毫巴",
+    "3658_m_above_mean_sea_level": "平均海平面以上3658米",
+    "375_mb": "375毫巴",
+    "3_mb": "3毫巴",
+    "4000_m_above_ground": "地面以上4000米",
+    "400_mb": "400毫巴",
+    "40_m_above_ground": "地面以上40米",
+    "40_mb": "40毫巴",
+    "425_mb": "425毫巴",
+    "450_mb": "450毫巴",
+    "4572_m_above_mean_sea_level": "平均海平面以上4572米",
+    "457_m_above_mean_sea_level": "平均海平面以上457米",
+    "475_mb": "475毫巴",
+    "500_mb": "500毫巴",
+    "50_m_above_ground": "地面以上50米",
+    "50_mb": "50毫巴",
+    "525_mb": "525毫巴",
+    "550_mb": "550毫巴",
+    "575_mb": "575毫巴",
+    "5_mb": "5毫巴",
+    "6000-0_m_above_ground": "地面以上6000-0米",
+    "600_mb": "600毫巴",
+    "60-30_mb_above_ground": "地面以上60-30毫巴",
+    "610_m_above_mean_sea_level": "平均海平面以上610米",
+    "625_mb": "625毫巴",
+    "650_mb": "650毫巴",
+    "675_mb": "675毫巴",
+    "700_mb": "700毫巴",
+    "70_mb": "70毫巴",
+    "725_mb": "725毫巴",
+    "750_mb": "750毫巴",
+    "775_mb": "775毫巴",
+    "7_mb": "7毫巴",
+    "800_mb": "800毫巴",
+    "80_m_above_ground": "地面以上80米",
+    "825_mb": "825毫巴",
+    "850_mb": "850毫巴",
+    "875_mb": "875毫巴",
+    "900_mb": "900毫巴",
+    "90-0_mb_above_ground": "地面以上90-0毫巴",
+    "90-60_mb_above_ground": "地面以上90-60毫巴",
+    "914_m_above_mean_sea_level": "平均海平面以上914米",
+    "925_mb": "925毫巴",
+    "950_mb": "950毫巴",
+    "975_mb": "975毫巴",
+    "boundary_layer_cloud_layer": "边界层云层",
+    "cloud_ceiling": "云底高度",
+    "convective_cloud_bottom_level": "对流云底部层",
+    "convective_cloud_layer": "对流云层",
+    "convective_cloud_top_level": "对流云顶部层",
+    "entire_atmosphere": "整个大气层",
+    "entire_atmosphere_(considered_as_a_single_layer)": "整个大气层(视为单层)",
+    "high_cloud_bottom_level": "高云底部层",
+    "high_cloud_layer": "高云层",
+    "high_cloud_top_level": "高云顶部层",
+    "highest_tropospheric_freezing_level": "对流层最高冻结层",
+    "low_cloud_bottom_level": "低云底部层",
+    "low_cloud_layer": "低云层",
+    "low_cloud_top_level": "低云顶部层",
+    "max_wind": "最大风级",
+    "mean_sea_level": "平均海平面",
+    "middle_cloud_bottom_level": "中云底部层",
+    "middle_cloud_layer": "中云层",
+    "middle_cloud_top_level": "中云顶部层",
+    "planetary_boundary_layer": "行星边界层",
+    "PV=-1.5e-06_(Km^2/kg/s)surface": "位势涡度=-1.5e-06 (Km²/kg/s) 表面",
+    "PV=1.5e-06(Km^2/kg/s)surface": "位势涡度=1.5e-06 (Km²/kg/s) 表面",
+    "PV=-1e-06(Km^2/kg/s)surface": "位势涡度=-1e-06 (Km²/kg/s) 表面",
+    "PV=1e-06(Km^2/kg/s)surface": "位势涡度=1e-06 (Km²/kg/s) 表面",
+    "PV=-2e-06(Km^2/kg/s)surface": "位势涡度=-2e-06 (Km²/kg/s) 表面",
+    "PV=2e-06(Km^2/kg/s)surface": "位势涡度=2e-06 (Km²/kg/s) 表面",
+    "PV=-5e-07(Km^2/kg/s)surface": "位势涡度=-5e-07 (Km²/kg/s) 表面",
+    "PV=5e-07(Km^2/kg/s)_surface": "位势涡度=5e-07 (Km²/kg/s) 表面",
+    "surface": "地面",
+    "top_of_atmosphere": "大气顶",
+    "tropopause": "对流层顶"
+}

+ 92 - 0
src/assets/weatherJson/variables.json

@@ -0,0 +1,92 @@
+{
+    "4LFTX": "表面最佳抬升指数",
+    "ABSV": "绝对涡度",
+    "ACPCP": "对流性降水累积量",
+    "ALBDO": "反照率",
+    "APCP": "降水量累积量",
+    "CAPE": "对流有效位能",
+    "CDUVB": "紫外线指数净清除量",
+    "CFRZR": "冻雨覆盖率",
+    "CICEP": "冰粒覆盖率",
+    "CIN": "对流抑制",
+    "CLWMR": "云水混合比",
+    "CNWAT": "植物冠层水量",
+    "CPOFP": "对流降水概率",
+    "CPRAT": "对流降水率",
+    "CRAIN": "降雨覆盖率",
+    "CSNOW": "降雪覆盖率",
+    "CWAT": "云水",
+    "CWORK": "云工作函数",
+    "DLWRF": "向下长波辐射通量",
+    "DPT": "露点温度",
+    "DSWRF": "向下短波辐射通量",
+    "DUVB": "向下紫外线辐射",
+    "DZDT": "垂直速度",
+    "FLDCP": "田间持水量",
+    "FRICV": "摩擦速度",
+    "GFLUX": "地面热通量",
+    "GRLE": "霰混合比",
+    "GUST": "阵风",
+    "HCDC": "高云量",
+    "HGT": "位势高度",
+    "HINDEX": "热指数",
+    "HLCY": "风暴相对螺旋度",
+    "HPBL": "行星边界层高度",
+    "ICAHT": "飞机积冰高度",
+    "ICEC": "冰覆盖率",
+    "ICEG": "冰生长",
+    "ICETK": "冰厚度",
+    "ICETMP": "冰温度",
+    "ICMR": "冰水混合比",
+    "LAND": "陆地覆盖率",
+    "LCDC": "低云量",
+    "LFTX": "抬升指数",
+    "LHTFL": "潜热通量",
+    "MCDC": "中云量",
+    "MSLET": "平均海平面气压",
+    "O3MR": "臭氧混合比",
+    "PEVPR": "潜在蒸发率",
+    "PLPL": "参数化降水类型",
+    "POT": "位温",
+    "PRATE": "降水率",
+    "PRES": "气压",
+    "PRMSL": "平均海平面气压",
+    "PWAT": "可降水量",
+    "REFC": "组合反射率",
+    "REFD": "差分反射率",
+    "RH": "相对湿度",
+    "RWMR": "雨水混合比",
+    "SFCR": "地表粗糙度",
+    "SHTFL": "感热通量",
+    "SNMR": "雪水混合比",
+    "SNOD": "雪深",
+    "SOILL": "土壤液体含量",
+    "SOILW": "土壤水分",
+    "SOTYP": "土壤类型",
+    "SPFH": "比湿",
+    "SUNSD": "日照时数",
+    "TCDC": "总云量",
+    "TMAX": "最高温度",
+    "TMIN": "最低温度",
+    "TMP": "温度",
+    "TOZNE": "总臭氧量",
+    "TSOIL": "土壤温度",
+    "UFLX": "u向动量通量",
+    "UGRD": "u向风速",
+    "U-GWD": "u向重力波拖曳",
+    "ULWRF": "向上长波辐射通量",
+    "USTM": "u向风暴运动",
+    "USWRF": "向上短波辐射通量",
+    "VEG": "植被覆盖率",
+    "VFLX": "v向动量通量",
+    "VGRD": "v向风速",
+    "V-GWD": "v向重力波拖曳",
+    "VIS": "能见度",
+    "VRATE": "植被生长率",
+    "VSTM": "v向风暴运动",
+    "VVEL": "垂直速度",
+    "VWSH": "垂直风切变",
+    "WATR": "水径流",
+    "WEASD": "雪水当量",
+    "WILT": "萎蔫点"
+}

+ 116 - 10
src/components/modelUnpack.vue

@@ -40,14 +40,8 @@
       </el-select>
     </div>
     <div class="sliderBarBox">
-      <el-slider v-model="splitWidth" size="small" @change="sliderChange" />
+      <el-slider v-model="splitWidth" size="small" @input="sliderChange" />
     </div>
-    <el-tag
-      style="position: absolute; bottom: 5px; left: 5px"
-      closable
-      :type="warning"
-      >这里可以对模型进行解构与透视,蓝色窗体为解构透视窗口,绿色窗体为正投预览窗口,顶部滑块用于切换两个窗口之间的位置,顶部下拉选框用于切换需要解构透视的部件。</el-tag
-    >
   </div>
 </template>
  
@@ -93,6 +87,8 @@ import { Color } from "../Three/Three.js";
 
 import WebGL from "../threeTool/WebGL";
 
+import axios from "axios";
+
 THREE.Cache.enabled = true;
 
 export default {
@@ -157,6 +153,10 @@ export default {
     };
   },
 
+  created() {
+    // this.test();
+  },
+
   mounted() {
     this.initLoader();
     this.initThree({
@@ -167,6 +167,80 @@ export default {
   },
 
   methods: {
+    async test() {
+      const rootRes = await axios.get("/nomads");
+      const gfsList = this.extractDOM(rootRes.data, "body p");
+      const firstGfsName = gfsList[1].querySelector("a").innerHTML;
+
+      const gfsRes = await axios.get(`/nomads?dir=/${firstGfsName}/00/atmos`);
+      const gfsDetailPage = this.extractDOM(gfsRes.data, "body form p");
+
+      console.log(999, gfsDetailPage);
+
+      const levelsList = gfsDetailPage[4];
+      const variablesList = gfsDetailPage[5];
+
+      const levelInputList = levelsList.querySelectorAll("input");
+      let lvl = [];
+      for (let i = 0; i < levelInputList.length; i++) {
+        const ipt = levelInputList[i];
+        const lvlStr = ipt
+          .getAttribute("name")
+          .replace(/^lev_/, "")
+          .replace(/\\/g, "");
+        lvl.push(lvlStr);
+      }
+
+      lvl.shift();
+
+      console.log(888, lvl.toString());
+
+      const varInputList = variablesList.querySelectorAll("input");
+      let variables= [];
+      for (let i = 0; i < varInputList.length; i++) {
+        const ipt = varInputList[i];
+        const varStr = ipt
+          .getAttribute("name")
+          .replace(/^var_/, "")
+          .replace(/\\/g, "");
+        variables.push(varStr);
+      }
+
+      variables.shift();
+
+      console.log(777, variables.toString());
+    },
+    // 提取DOM元素函数
+    extractDOM(htmlString, selector) {
+      if (!htmlString.trim()) {
+        showMessage("请输入HTML字符串", "error");
+        return;
+      }
+
+      if (!selector.trim()) {
+        showMessage("请输入CSS选择器", "error");
+        return;
+      }
+
+      try {
+        // 使用DOMParser解析HTML字符串
+        const parser = new DOMParser();
+        const doc = parser.parseFromString(htmlString, "text/html");
+
+        // 使用选择器查找元素
+        const element = doc.querySelectorAll(selector);
+
+        if (element) {
+          // 输出元素的outerHTML
+          return element;
+        } else {
+          console.log("未匹配到元素:", selector);
+        }
+      } catch (error) {
+        console.log("解析HTML时出错: ", error.message);
+      }
+    },
+
     bjChange(uuid) {
       let modelBjList = this.scene.children.find((modelEle) => {
         return !modelEle.isLight && !modelEle.isLineSegments;
@@ -190,8 +264,40 @@ export default {
 
     sliderChange(value) {
       const rBox_Toushi = document.querySelector(".r");
-      rBox_Toushi.style.width = `${value}%`;
-      rBox_Toushi.style.left = `${value}%`;
+      const canvasStyle_Toushi = document.querySelector(".threeToushi canvas");
+
+      if (value >= 50) {
+        rBox_Toushi.style.width = `${value}%`;
+        rBox_Toushi.style.left = `${value}%`;
+        canvasStyle_Toushi.style.left = `-100%`;
+      } else {
+        const leftFix = 50 - value;
+        canvasStyle_Toushi.style.left = `-${100 - this.calcFixBeiLv(leftFix)}%`;
+        rBox_Toushi.style.width = `${100 - value}%`;
+        rBox_Toushi.style.left = `${value}%`;
+      }
+    },
+
+    calcFixBeiLv(value) {
+      return 4 * value;
+      switch (value) {
+        case 1:
+          return 96;
+        case 2:
+          return 92.4;
+        case 3:
+          return 88.75;
+        case 4:
+          return 85.25;
+        case 5:
+          return 81.75;
+        case 6:
+          return 78.4;
+        case 7:
+          return 75.5;
+        default:
+          return 4 * value;
+      }
     },
 
     initThree(options) {
@@ -442,7 +548,7 @@ export default {
           ".threeToushi canvas"
         );
         canvasStyle_Toushi.style.position = "absolute";
-        canvasStyle_Toushi.style.left = "-100%";
+        canvasStyle_Toushi.style.left = `-100%`;
         // 初始化射线发射器
         let raycaster = new Raycaster();
 

+ 5 - 0
vite.config.js

@@ -31,6 +31,11 @@ export default defineConfig({
         target: 'https://www.ventusky.com',
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/ventusky/, '')
+      },
+      '/nomads': {
+        target: 'https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p50.pl',
+        changeOrigin: true,
+        rewrite: (path) => path.replace(/^\/nomads/, '')
       }
     }
   }