Koishi 11 месяцев назад
Родитель
Сommit
da2f83312e

+ 53 - 17
src/assets/windimgs/fanSvg/sl.svg

@@ -1,7 +1,16 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 93.5 96.5" style="enable-background:new 0 0 93.5 96.5;" xml:space="preserve">
+<svg
+  version="1.1"
+  id="图层_1"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  x="0px"
+  y="0px"
+  viewBox="0 0 93.5 96.5"
+  style="enable-background:new 0 0 93.5 96.5;"
+  xml:space="preserve"
+>
 <style type="text/css">
 	.st0{fill:#D8D8D8;}
 	.st1{fill:#FFFFFF;}
@@ -9,30 +18,57 @@
 	.st3{fill:#B1E1EB;}
 </style>
 <g>
-	<path class="st0" d="M46,39.2l-2.2,50.3c0,0,1.9,0.7,3.6,0.7c1.7,0,3.8-0.7,3.8-0.7l-2.2-50.3C48.9,39.2,46,39.2,46,39.2z"/>
+	<path
+      class="st0"
+      d="M46,39.2l-2.2,50.3c0,0,1.9,0.7,3.6,0.7c1.7,0,3.8-0.7,3.8-0.7l-2.2-50.3C48.9,39.2,46,39.2,46,39.2z"
+    />
 </g>
 <g>
 	<g>
-		<path class="st1" d="M45.4,37.3l3.9,1.5c0,0,10.1-21.3,10.8-32.8C52.6,15.2,45.4,37.3,45.4,37.3"/>
-		<path class="st1" d="M49.1,38.8l-3.2,2.6c0,0,13.6,19.2,23.4,25.5C65,55.9,49.1,38.8,49.1,38.8"/>
-		<path class="st1" d="M45.7,41.6l0-4.1c0,0-23.5-2-34.5,1.4C22.5,42.7,45.7,41.6,45.7,41.6"/>
+		<path
+        class="st1"
+        d="M45.4,37.3l3.9,1.5c0,0,10.1-21.3,10.8-32.8C52.6,15.2,45.4,37.3,45.4,37.3"
+      />
+		<path
+        class="st1"
+        d="M49.1,38.8l-3.2,2.6c0,0,13.6,19.2,23.4,25.5C65,55.9,49.1,38.8,49.1,38.8"
+      />
+		<path
+        class="st1"
+        d="M45.7,41.6l0-4.1c0,0-23.5-2-34.5,1.4C22.5,42.7,45.7,41.6,45.7,41.6"
+      />
 	</g>
 	<g>
-		<path class="st0" d="M49.1,38.3l11-32.8c0,0-0.1,2-0.2,2.7c-0.1,0.6-0.3,1.7-0.4,2.2c-0.1,0.5-0.4,1.8-0.4,1.8s-0.6,2.4-0.8,3.1
-			c-0.8,2.6-2.5,7.6-3.4,10.1c-0.8,2.1-2.5,6.3-3.4,8.4c-0.5,1.1-2,4.5-2,4.5"/>
-		<path class="st0" d="M46.4,41.5l23.2,25.6c0,0-1.7-1.1-2.2-1.5c-0.5-0.3-1.3-1.1-1.7-1.4c-0.3-0.3-1.4-1.2-1.4-1.2
-			s-1.8-1.7-2.3-2.2c-1.9-1.9-5.5-5.9-7.2-7.9c-1.5-1.7-4.3-5.3-5.7-7.1c-0.7-1-2.9-4-2.9-4"/>
-		<path class="st0" d="M45.4,37.8L10.8,39c0,0,1.9-0.6,2.6-0.8c0.5-0.1,1.7-0.3,2.2-0.4c0.5-0.1,1.8-0.2,1.8-0.2s2.4-0.3,3.2-0.3
-			c2.7-0.2,8-0.4,10.7-0.3c2.3,0,6.8,0.1,9.1,0.3c1.2,0.1,4.9,0.3,4.9,0.3"/>
+		<path
+        class="st0"
+        d="M49.1,38.3l11-32.8c0,0-0.1,2-0.2,2.7c-0.1,0.6-0.3,1.7-0.4,2.2c-0.1,0.5-0.4,1.8-0.4,1.8s-0.6,2.4-0.8,3.1
+			c-0.8,2.6-2.5,7.6-3.4,10.1c-0.8,2.1-2.5,6.3-3.4,8.4c-0.5,1.1-2,4.5-2,4.5"
+      />
+		<path
+        class="st0"
+        d="M46.4,41.5l23.2,25.6c0,0-1.7-1.1-2.2-1.5c-0.5-0.3-1.3-1.1-1.7-1.4c-0.3-0.3-1.4-1.2-1.4-1.2
+			s-1.8-1.7-2.3-2.2c-1.9-1.9-5.5-5.9-7.2-7.9c-1.5-1.7-4.3-5.3-5.7-7.1c-0.7-1-2.9-4-2.9-4"
+      />
+		<path
+        class="st0"
+        d="M45.4,37.8L10.8,39c0,0,1.9-0.6,2.6-0.8c0.5-0.1,1.7-0.3,2.2-0.4c0.5-0.1,1.8-0.2,1.8-0.2s2.4-0.3,3.2-0.3
+			c2.7-0.2,8-0.4,10.7-0.3c2.3,0,6.8,0.1,9.1,0.3c1.2,0.1,4.9,0.3,4.9,0.3"
+      />
 	</g>
 	
-		<animateTransform  accumulate="none" additive="replace" attributeName="transform" attributeType="XML" calcMode="linear" dur="4s" fill="remove" from="0 46.75 39.182" repeatCount="indefinite" restart="always" to="359 46.75 39.182" type="rotate">
-		</animateTransform>
+		<!-- <animateTransform  accumulate="none" additive="replace" attributeName="transform" attributeType="XML" calcMode="linear" dur="4s" fill="remove" from="0 46.75 39.182" repeatCount="indefinite" restart="always" to="359 46.75 39.182" type="rotate">
+		</animateTransform> -->
 </g>
 <g>
-	<path class="st2" d="M42.7,39.2c0,2.5,2.1,4.5,4.7,4.5s4.7-2,4.7-4.5c0-2.5-2.1-4.5-4.7-4.5S42.7,36.7,42.7,39.2"/>
+	<path
+      class="st2"
+      d="M42.7,39.2c0,2.5,2.1,4.5,4.7,4.5s4.7-2,4.7-4.5c0-2.5-2.1-4.5-4.7-4.5S42.7,36.7,42.7,39.2"
+    />
 </g>
 <g>
-	<path class="st3" d="M44.4,39.2c0,1.6,1.4,2.8,3,2.8c1.7,0,3-1.3,3-2.8c0-1.6-1.4-2.8-3-2.8S44.4,37.6,44.4,39.2"/>
+	<path
+      class="st3"
+      d="M44.4,39.2c0,1.6,1.4,2.8,3,2.8c1.7,0,3-1.3,3-2.8c0-1.6-1.4-2.8-3-2.8S44.4,37.6,44.4,39.2"
+    />
 </g>
 </svg>

+ 67 - 25
src/assets/windimgs/fanSvg/xd.svg

@@ -1,8 +1,26 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 93.5 96.5"
-    enable-background="new 0 0 93.5 96.5" xml:space="preserve">
+<svg
+  version="1.1"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  viewBox="0 0 93.5 96.5"
+  enable-background="new 0 0 93.5 96.5"
+  xml:space="preserve"
+>
     <defs>
-        <rect id="SVGID_1_" x="-260.14" y="-365.945" width="595.28" height="841.89" />
-        <rect id="SVGID_3_" x="-260.14" y="-365.945" width="595.28" height="841.89" />
+        <rect
+      id="SVGID_1_"
+      x="-260.14"
+      y="-365.945"
+      width="595.28"
+      height="841.89"
+    />
+        <rect
+      id="SVGID_3_"
+      x="-260.14"
+      y="-365.945"
+      width="595.28"
+      height="841.89"
+    />
     </defs>
     <clipPath id="SVGID_2_">
         <use xlink:href="#SVGID_1_" overflow="visible" />
@@ -12,48 +30,72 @@
     </clipPath>
     <!-- 柱 -->
     <g>
-        <path fill="#D8D8D8" d="M45.96,39.183l-2.22,50.288c0,0,1.916,0.747,3.605,0.747c1.738,0,3.752-0.747,3.752-0.747l-2.181-50.288
-        H45.96z" />
+        <path
+      fill="#D8D8D8"
+      d="M45.96,39.183l-2.22,50.288c0,0,1.916,0.747,3.605,0.747c1.738,0,3.752-0.747,3.752-0.747l-2.181-50.288
+        H45.96z"
+    />
     </g>
     <!-- 风扇 -->
     <g>
         <!-- 风扇灰色部分 -->
         <g>
-            <path fill="#c531c7"
-                d="M45.427,37.35l3.854,1.471c0,0,10.131-21.287,10.834-32.815C52.61,15.16,45.427,37.35,45.427,37.35" />
-            <path fill="#c531c7"
-                d="M49.088,38.821l-3.163,2.647c0,0,13.648,19.221,23.373,25.454C64.962,55.908,49.088,38.821,49.088,38.821" />
-            <path fill="#c531c7"
-                d="M45.749,41.592l0.022-4.125c0,0-23.489-2-34.528,1.396C22.452,42.669,45.749,41.592,45.749,41.592" />
+            <path
+        fill="#c531c7"
+        d="M45.427,37.35l3.854,1.471c0,0,10.131-21.287,10.834-32.815C52.61,15.16,45.427,37.35,45.427,37.35"
+      />
+            <path
+        fill="#c531c7"
+        d="M49.088,38.821l-3.163,2.647c0,0,13.648,19.221,23.373,25.454C64.962,55.908,49.088,38.821,49.088,38.821"
+      />
+            <path
+        fill="#c531c7"
+        d="M45.749,41.592l0.022-4.125c0,0-23.489-2-34.528,1.396C22.452,42.669,45.749,41.592,45.749,41.592"
+      />
         </g>
         <!-- 风扇白色部分 -->
         <g>
-            <path fill="#D8D8D8" d="M49.095,38.328l11.02-32.752c0,0-0.102,2.009-0.186,2.674c-0.068,0.56-0.282,1.67-0.402,2.222
+            <path
+        fill="#D8D8D8"
+        d="M49.095,38.328l11.02-32.752c0,0-0.102,2.009-0.186,2.674c-0.068,0.56-0.282,1.67-0.402,2.222
         c-0.1,0.454-0.421,1.81-0.421,1.81s-0.583,2.35-0.815,3.123c-0.767,2.562-2.484,7.63-3.438,10.129
-        c-0.805,2.119-2.529,6.314-3.434,8.393c-0.492,1.132-2.029,4.5-2.029,4.5" />
-            <path fill="#D8D8D8" d="M46.446,41.545l23.227,25.585c0,0-1.705-1.066-2.244-1.465c-0.457-0.334-1.32-1.061-1.744-1.436
+        c-0.805,2.119-2.529,6.314-3.434,8.393c-0.492,1.132-2.029,4.5-2.029,4.5"
+      />
+            <path
+        fill="#D8D8D8"
+        d="M46.446,41.545l23.227,25.585c0,0-1.705-1.066-2.244-1.465c-0.457-0.334-1.32-1.061-1.744-1.436
         c-0.348-0.307-1.375-1.248-1.375-1.248s-1.769-1.656-2.33-2.234c-1.863-1.918-5.451-5.889-7.17-7.938
-        c-1.456-1.737-4.28-5.287-5.654-7.091c-0.748-0.98-2.939-3.965-2.939-3.965" />
-            <path fill="#D8D8D8" d="M45.376,37.815l-34.535,1.201c0,0,1.915-0.614,2.569-0.768c0.548-0.131,1.662-0.324,2.22-0.406
+        c-1.456-1.737-4.28-5.287-5.654-7.091c-0.748-0.98-2.939-3.965-2.939-3.965"
+      />
+            <path
+        fill="#D8D8D8"
+        d="M45.376,37.815l-34.535,1.201c0,0,1.915-0.614,2.569-0.768c0.548-0.131,1.662-0.324,2.22-0.406
         c0.459-0.066,1.843-0.241,1.843-0.241s2.405-0.28,3.211-0.335c2.667-0.181,8.015-0.356,10.691-0.345
-        c2.267,0.01,6.798,0.149,9.064,0.265c1.231,0.064,4.926,0.318,4.926,0.318" />
+        c2.267,0.01,6.798,0.149,9.064,0.265c1.231,0.064,4.926,0.318,4.926,0.318"
+      />
         </g>
-        <animateTransform attributeName="transform"
+        <!-- <animateTransform attributeName="transform"
             attributeType="XML"
             type="rotate"
             from="0 46.75 39.182"
             to="359 46.75 39.182"
             dur="8s"
-            repeatCount="indefinite"/>
+            repeatCount="indefinite"/> -->
     </g>
     <!-- 中心圆大 -->
     <g>
-        <path fill="#60BFD6" d="M42.686,39.182c0,2.504,2.117,4.545,4.732,4.545s4.733-2.041,4.733-4.545c0-2.512-2.118-4.544-4.733-4.544
-        S42.686,36.67,42.686,39.182" />
+        <path
+      fill="#60BFD6"
+      d="M42.686,39.182c0,2.504,2.117,4.545,4.732,4.545s4.733-2.041,4.733-4.545c0-2.512-2.118-4.544-4.733-4.544
+        S42.686,36.67,42.686,39.182"
+    />
     </g>
     <!-- 中心圆小 -->
     <g>
-        <path fill="#B1E1EB" d="M44.4,39.182c0,1.561,1.353,2.831,3.017,2.831c1.663,0,3.02-1.27,3.02-2.831c0-1.56-1.356-2.829-3.02-2.829
-        C45.753,36.353,44.4,37.622,44.4,39.182" />
+        <path
+      fill="#B1E1EB"
+      d="M44.4,39.182c0,1.561,1.353,2.831,3.017,2.831c1.663,0,3.02-1.27,3.02-2.831c0-1.56-1.356-2.829-3.02-2.829
+        C45.753,36.353,44.4,37.622,44.4,39.182"
+    />
     </g>
-</svg>
+</svg>

BIN
src/assets/windimgs/fanSvg/yp_black.png


BIN
src/assets/windimgs/fanSvg/yp_blue.png


BIN
src/assets/windimgs/fanSvg/yp_green.png


BIN
src/assets/windimgs/fanSvg/yp_orange.png


BIN
src/assets/windimgs/fanSvg/yp_purple.png


BIN
src/assets/windimgs/fanSvg/yp_red.png


BIN
src/assets/windimgs/fanSvg/yp_white.png


+ 1 - 1
src/router/index.js

@@ -36,7 +36,7 @@ const routes = [
     },
     //风机地图页面
     {
-        path: '/topographicMap',
+        path: '/windMap',
         name: 'topographicMap',
         component: () => import('../views/cesiumComponents/topographicMap.vue')
     },

+ 91 - 2
src/views/cesium.vue

@@ -86,6 +86,10 @@
               frameborder="0"
               style="width: 100%; height: 100%"
             ></iframe>
+              <!-- src="https://www.bilibili.com/video/BV1421DYCELw?t=12.1" -->
+            <video ref="videoPlayer" controls width="95%">
+                <source src="/public/static/windVideo.mp4" type="video/mp4" />
+            </video>
           </div>
           <div class="gzck" v-if="showProblemMsg">
             <windPro />
@@ -96,6 +100,7 @@
     <cesiumweatherView
       :viewer="viewer"
       :sidebarRightData="sidebarRightData"
+      :stationValue="stationValue"
       @coverOnChange="coverOnChange"
       @changeType="changeType"
       v-if="showTypeViewer"
@@ -487,6 +492,57 @@ export default {
       this.viewer.imageryLayers.addImageryProvider(imageryProvider);
     },
 
+    // 初始化地形
+    async initCesiumTerrain() {
+      const terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl(
+        // "http://localhost:3007/tiles/dixing",
+        "./public/static/dixing",
+        {
+          requestWaterMask: true, // 如果需要水效果,设置为true
+          requestVertexNormals: true, // 如果需要光照效果,设置为true
+          requestMetadata: true, // 请求元数据
+          // minimumLevel: 10,
+          maximumLevel: 15,
+        }
+      );
+      this.viewer.terrainProvider = terrainProvider;
+
+      // const terrainProvider = new Cesium.CesiumTerrainProvider({
+      //   url: "http://localhost:3007/tiles/dixing", // 地形数据所在目录的URL
+      //   requestWaterMask: true, // 如果需要水效果,设置为true
+      //   requestVertexNormals: true, // 如果需要光照效果,设置为true
+      //   minimumLevel: 10,
+      //   maximumLevel: 15,
+      // });
+      // this.viewer.terrainProvider = terrainProvider;
+
+      // const imageryProvider = new Cesium.UrlTemplateImageryProvider({
+      //   url: "http://localhost:3007/tiles/dixing/{z}/{x}/{y}",
+      //   // url: "./public/static/dixing/{z}/{x}/{y}.terrain",
+      //   credit: "地形数据",
+      // });
+
+      // this.viewer.imageryLayers.addImageryProvider(imageryProvider);
+
+      // this.viewer.scene.globe.depthTestAgainstTerrain = true; //地形遮挡效果开关,打开后地形会遮挡看不到的区域
+      this.viewer.scene.globe.enableLighting = true; //对大气和雾启用动态照明效果
+    },
+
+    // 初始化底图
+    async initCesiumBaseMapImage() {
+      const imageryProvider = await new Cesium.UrlTemplateImageryProvider({
+        // url: "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
+        // url: "http://localhost:3007/tiles/map/{z}/{x}/{y}",
+        url: "./public/static/ditu/{z}/{x}/{y}.png",
+        credit: "影像地图",
+      });
+      imageryProvider.alpha = 0.55; // 透明度
+      imageryProvider.brightness = 1; // 亮度
+      imageryProvider.contrast = 1; // 对比度
+
+      this.viewer.imageryLayers.addImageryProvider(imageryProvider);
+    },
+
     // 初始化城市
     async initCityCesium() {
       Cesium.Ion.defaultAccessToken =
@@ -1076,7 +1132,7 @@ export default {
     // 添加风场图
     async showWindLayer() {
       if (!this.windLayer) {
-        this.resetViewport(6000000);
+        // this.resetViewport(6000000);
         // 色值面板
         const CONTROL_COLOR = {
           uv: [
@@ -1116,6 +1172,39 @@ export default {
           this.trJsonData(windGridData),
           CONTROL_COLOR
         );
+        // this.windLayer = new WindLayer(windGridData, { 
+        //   particleSize: 2.0,
+        //   particleOpacity: 0.6,
+        //   particleSpeed: 0.01,
+        //   maxVelocity: 25,// 风速最大值(用于颜色映射和速度缩放)
+        //   minVelocity: 0, // 风速最小值阈值(低于此值不显示粒子)
+        //   colorScale: [
+        //     "rgb(36,104, 180)",
+        //     "rgb(60,157, 194)",
+        //     "rgb(128,205,193)",
+        //     "rgb(151,218,168)",
+        //     "rgb(198,231,181)",
+        //     "rgb(238,247,217)",
+        //     "rgb(255,238,159)",
+        //     "rgb(252,217,125)",
+        //     "rgb(255,182,100)",
+        //     "rgb(252,150,75)",
+        //     "rgb(250,112,52)",
+        //     "rgb(245,64,32)",
+        //     "rgb(237,45,28)",
+        //     "rgb(220,24,32)",
+        //     "rgb(180,0,35)",
+        //   ],// 颜色强度缩放
+        //   frameRate: 15,
+        //   fadeOpacity: 0.995,
+        //   particleAge: 150,
+        //   maxAge: 60,
+        //   globalAlpha: 0.8,
+        //   velocityScale: 1 / 30,// 粒子移动速度缩放因子(控制动画快慢)
+        //   paths: 250,
+        //   lineWidth: 2,
+        // });
+        // this.windLayer.addTo(this.viewer);
       }
     },
 
@@ -1230,7 +1319,7 @@ export default {
 
         // 显示下一张图片
         imageLayers[currentImageIndex].show = true;
-        imageLayers[currentImageIndex + 1].show = true;
+        // imageLayers[currentImageIndex + 1].show = true;
         console.log("当前显示图片: " + imageUrls[currentImageIndex]);
       }
 

+ 28 - 14
src/views/cesiumComponents/fjLonLat.json

@@ -1424,98 +1424,112 @@
             "longitude": 114.48421,
             "latitude": 35.34992,
             "name": "F03号风机",
-            "aname": "F03"
+            "aname": "F03",
+            "status": 7
         },
         {
             "nemCode": "F04",
             "longitude": 114.56900,
             "latitude": 35.31883,
             "name": "F04号风机",
-            "aname": "F04"
+            "aname": "F04",
+            "status": 3
         },
         {
             "nemCode": "F05",
             "longitude": 114.47299,
             "latitude": 35.33221,
             "name": "F05号风机",
-            "aname": "F05"
+            "aname": "F05",
+            "status": 7
         },
         {
             "nemCode": "F06",
             "longitude": 114.47547,
             "latitude": 35.32451,
             "name": "F06号风机",
-            "aname": "F06"
+            "aname": "F06",
+            "status": 3
         },
         {
             "nemCode": "F07",
             "longitude": 114.48236,
             "latitude": 35.32497,
             "name": "F07号风机",
-            "aname": "F07"
+            "aname": "F07",
+            "status": 4
         },
         {
             "nemCode": "F08",
             "longitude": 114.48789,
             "latitude": 35.32916,
             "name": "F08号风机",
-            "aname": "F08"
+            "aname": "F08",
+            "status": 5
         },
         {
             "nemCode": "F09",
             "longitude": 114.44517,
             "latitude": 35.32300,
             "name": "F09号风机",
-            "aname": "F09"
+            "aname": "F09",
+            "status": 4
         },
         {
             "nemCode": "F10",
             "longitude": 114.44781,
             "latitude": 35.32297,
             "name": "F10号风机",
-            "aname": "F10"
+            "aname": "F10",
+            "status": 5
         },
         {
             "nemCode": "F11",
             "longitude": 114.44781,
             "latitude": 35.30587,
             "name": "F11号风机",
-            "aname": "F11"
+            "aname": "F11",
+            "status": 7
         },
         {
             "nemCode": "F12",
             "longitude": 114.47172,
             "latitude": 35.29389,
             "name": "F12号风机",
-            "aname": "F12"
+            "aname": "F12",
+            "status": 6
         },
         {
             "nemCode": "F13",
             "longitude": 114.59705,
             "latitude": 35.28476,
             "name": "F13号风机",
-            "aname": "F13"
+            "aname": "F13",
+            "status": 5
         },
         {
             "nemCode": "F14",
             "longitude": 114.59237,
             "latitude": 35.28616,
             "name": "F14号风机",
-            "aname": "F14"
+            "aname": "F14",
+            "status": 6
         },
         {
             "nemCode": "F15",
             "longitude": 114.55623,
             "latitude": 35.28261,
             "name": "F15号风机",
-            "aname": "F15"
+            "aname": "F15",
+            "status": 7
         },
         {
             "nemCode": "F16",
             "longitude": 114.58545,
             "latitude": 35.30268,
             "name": "F16号风机",
-            "aname": "F16"
+            "aname": "F16",
+            "status": 7
         }
     ]
 }

+ 496 - 20
src/views/cesiumComponents/topographicMap.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="mapBox">
     <div id="cesiumContainer" style="width: 100%; height: 100vh"></div>
-    <div :class="!menuComTStyB ? 'menuComTSty' : 'menuComT'">
+    <div :class="!menuComTStyB ? 'menuComTSty' : 'menuComT'" v-if="0">
       <menuCom
         :showbasemap="false"
         :showwindspeed="false"
@@ -37,11 +37,14 @@
             <windHome :modelValItem="modelVal" />
           </div>
           <div class="spjk" v-if="showVideoMsg">
-            <iframe
-              src="https://www.bilibili.com/video/BV1421DYCELw?t=12.1"
+            <!-- <iframe
+              src="/public/static/windVideo.mp4"
               frameborder="0"
               style="width: 100%; height: 100%"
-            ></iframe>
+            ></iframe> -->
+            <video ref="videoPlayer" controls width="95%">
+                <source src="/public/static/windVideo.mp4" type="video/mp4" />
+            </video>
           </div>
           <div class="gzck" v-if="showProblemMsg">
             <windPro />
@@ -60,7 +63,8 @@
       :modelVal="modelVal"
       @showDia="showComDia"
     />
-    <windView v-if="showWindDetail" @showDetail="menuComTSty" @backStations="backStations" />
+    <windView v-if="showWindDetail" :showWeather="showWeather" @coverOnChange="coverOnChange"
+     @showDetail="menuComTSty" @backStations="backStations" />
   </div>
 </template>
 
@@ -74,6 +78,10 @@ import comModelDialog from "@/components/comModelDialog.vue";
 import windView from "./windView.vue";
 import menuCom from "../menuCom.vue";
 
+import cloudJson from "/public/static/exportData/cloud/layer.json";
+import rainJson from "/public/static/exportData/rain/layer.json";
+import tempJson from "/public/static/exportData/tmp/layer.json";
+
 // import bw from "@/assets/windimgs/fanSvg/bw.svg"
 //风场展示图标
 import fc from "@/assets/windimgs/fanSvg/fc.png"
@@ -81,8 +89,19 @@ import fc from "@/assets/windimgs/fanSvg/fc.png"
 import hd from "@/assets/windimgs/fanSvg/hd.png"
 //光伏电站展示图标
 import gf from "@/assets/windimgs/fanSvg/gf.png"
+
+//故障
+import gz from "@/assets/windimgs/fanSvg/gz.svg"
 //待机
 import dj from "@/assets/windimgs/fanSvg/dj.svg"
+//检修
+import jx from "@/assets/windimgs/fanSvg/jx.svg"
+//限电
+import xd from "@/assets/windimgs/fanSvg/xd.svg"
+//离线
+import lx from "@/assets/windimgs/fanSvg/lx.svg"
+//受累
+import sl from "@/assets/windimgs/fanSvg/sl.svg"
 //动图使用柱子和扇叶
 import bwzhu from "@/assets/windimgs/fanSvg/bwzhu.svg"
 import bwshan from "@/assets/windimgs/fanSvg/bwshan.png"
@@ -90,6 +109,9 @@ import bwshan from "@/assets/windimgs/fanSvg/bwshan.png"
 import windHome from "@/components/windHome/index.vue";
 import windPro from "@/components/windProDetail/windProblem.vue";
 import ModelUnpack from "@/components/modelUnpack.vue";
+
+import { WindLayer } from "cesium-wind";
+import windGridData from "./windGridData.json";
 export default {
   components: {
     comModelDialog,
@@ -102,6 +124,17 @@ export default {
   data() {
     return {
       viewer: null,
+      windLayer: null, // 风场图
+      windLayerTimmer: null, // 风场图计时器
+      cloudImagesLayer: [], // 卫星云图
+      cloudLayer: null, // 卫星云图
+      cloudintervalId: null,
+      rainImagesLayer: [], // 降雨图
+      rainLayer: null, // 降雨图
+      rainintervalId: null, // 降雨图
+      tempImagesLayer: [], //温度图
+      temperatureLayer: null, //温度图
+      tempintervalId: null, //温度图
       showcomModelDia: false,
       modelVal: null,
       menuComTStyB: false,
@@ -113,9 +146,11 @@ export default {
       showVideoMsg: false,
       showProblemMsg: false,
       showModelMsg: false,
-      showWindDetail: false,
+      showWindDetail: true,
       allStationentitys: [],
-      allWindEntitys: []
+      allWindEntitys: [],
+      showWeather: false,
+      urlTiles: "/public/static/tiles/{z}/{x}/{y}.jpg"
     };
   },
   mounted() {
@@ -141,7 +176,8 @@ export default {
         });
 
         const imageryProvider = new Cesium.UrlTemplateImageryProvider({
-            url: "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
+            url: this.urlTiles,
+            // url: "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
             // url: "http://192.168.2.180:3007/tiles/map/{z}/{x}/{y}",
             credit: "影像地图",
         });
@@ -153,7 +189,10 @@ export default {
         viewer._cesiumWidget._creditContainer.style.display = "none";
         //   this.csceneElliposid(viewer)
         this.viewer = viewer;
-        this.showAllStation(viewer)
+        // 展示场站
+        // this.showAllStation(viewer)
+        // 展示风机
+        this.showWindFromStation(viewer)
         this.initGeoJsonData()
     },
     // 初始化 geoJson 数据
@@ -291,9 +330,20 @@ export default {
             if (e.status) {
                 if (e.status === 1) {
                     this.showStatuswind(viewer, e, dj)
+                } else if (e.status === 2) {
+                    this.showStatuswind(viewer, e, gz)
+                } else if (e.status === 3) {
+                    this.showStatuswind(viewer, e, jx)
+                } else if (e.status === 4) {
+                    this.showStatuswind(viewer, e, xd)
+                } else if (e.status === 5) {
+                    this.showStatuswind(viewer, e, lx)
+                } else if (e.status === 6) {
+                    this.showStatuswind(viewer, e, sl)
+                } else {
+                    //并网风机
+                    this.showAnimatewind(viewer, e)
                 }
-            } else {
-                this.showAnimatewind(viewer, e)
             }
         });
         this.resetWindViewport()
@@ -445,6 +495,7 @@ export default {
                 font: '14px sans-serif',
                 fillColor: Cesium.Color.fromBytes(255, 255, 255),
                 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+                pixelOffset: val.name === 'F10号风机' ? new Cesium.Cartesian2(40, -20) : new Cesium.Cartesian2(0, 0)
             }
         });
         // 创建事件处理器
@@ -483,7 +534,7 @@ export default {
             rotation: new Cesium.CallbackProperty(function(time) {
             // 每 3 秒转一圈(可调速度)
             const seconds = time.secondsOfDay;
-            const angle = Cesium.Math.toRadians((seconds % 3) * 360 / 3); // 每3秒一圈
+            const angle = Cesium.Math.toRadians((seconds % 3) * -360 / 3); // 每3秒一圈
             return angle;
             }, false),
             // 确保绕中心旋转
@@ -763,15 +814,439 @@ export default {
     },
     // 重置风场中所有风机视角
     resetWindViewport() {
-      this.viewer.camera.flyTo({
-        destination: Cesium.Cartesian3.fromDegrees(114.502778,35.326667, 20000),
-        orientation: {
-          heading: Cesium.Math.toRadians(0),
-          pitch: Cesium.Math.toRadians(-90),
-          roll: 0.0,
-        },
-        duration: 3.0,
+        // 目标位置:经度、纬度、高度
+        const targetLon = 114.502778;
+        const targetLat = 35.326667;
+        const targetHeight = 20000;
+
+        const draggableHeightTolerance = 10000; // 允许拖拽的高度范围:18,000 ~ 22,000
+        const minHeight = 10000;   // 最低高度
+        const maxHeight = 800000;  // 最高高度
+
+        const allowedOffsetDegrees = 0.2; // 允许拖拽的最大偏移(经纬度)
+
+        const minLon = targetLon - allowedOffsetDegrees;
+        const maxLon = targetLon + allowedOffsetDegrees;
+        const minLat = targetLat - allowedOffsetDegrees;
+        const maxLat = targetLat + allowedOffsetDegrees;
+
+        let that = this
+        that.viewer.camera.flyTo({
+            destination: Cesium.Cartesian3.fromDegrees(targetLon,targetLat, targetHeight),
+            orientation: {
+            heading: Cesium.Math.toRadians(0),
+            pitch: Cesium.Math.toRadians(-90),
+            roll: 0.0,
+            },
+            duration: 3.0,
+            complete: function () {
+                console.log('飞入完成,启用拖拽限制逻辑');
+                enableHeightBasedDragControl();
+            }
+        });
+        // ===== 控制逻辑:根据高度决定是否允许拖拽 =====
+        function enableHeightBasedDragControl() {
+            that.viewer.scene.preUpdate.addEventListener(function (scene, time) {
+                const camera = that.viewer.camera;
+                const posCartographic = camera.positionCartographic;
+
+                if (!posCartographic) return;
+
+                const currentHeight = posCartographic.height;
+                const currentLon = Cesium.Math.toDegrees(posCartographic.longitude);
+                const currentLat = Cesium.Math.toDegrees(posCartographic.latitude);
+
+                // === 第一步:限制相机高度不能超出 [10000, 100000] ===
+                if (currentHeight < minHeight) {
+                // 强制拉高到 minHeight,但保持当前水平视角
+                const newPos = Cesium.Cartesian3.fromDegrees(currentLon, currentLat, minHeight);
+                camera.setView({
+                    destination: newPos,
+                    orientation: {
+                    heading: camera.heading,
+                    pitch: camera.pitch,
+                    roll: camera.roll
+                    }
+                });
+                return; // 避免后续逻辑冲突
+                }
+
+                if (currentHeight > maxHeight) {
+                    that.showWeather = true
+                    const newPos = Cesium.Cartesian3.fromDegrees(currentLon, currentLat, maxHeight);
+                    camera.setView({
+                        destination: newPos,
+                        orientation: {
+                        heading: camera.heading,
+                        pitch: camera.pitch,
+                        roll: camera.roll
+                        }
+                    });
+                    return;
+                }
+                if (currentHeight < (maxHeight-1000)) {
+                    that.showWeather = false
+                    that.cancleAllLayer();
+                }
+
+                // === 第二步:判断是否在“可拖拽高度区间” ===
+                const isInDraggableRange =
+                currentHeight >= (targetHeight - draggableHeightTolerance) &&
+                currentHeight <= (targetHeight + draggableHeightTolerance);
+
+                if (isInDraggableRange) {
+                // ✅ 允许拖拽,但限制在指定范围内
+                const correctedLon = Cesium.Math.clamp(currentLon, minLon, maxLon);
+                const correctedLat = Cesium.Math.clamp(currentLat, minLat, maxLat);
+
+                if (Math.abs(correctedLon - currentLon) > 1e-8 || 
+                    Math.abs(correctedLat - currentLat) > 1e-8) {
+                    // 越界了,纠正位置,保留当前高度和视角
+                    camera.setView({
+                    destination: Cesium.Cartesian3.fromDegrees(correctedLon, correctedLat, currentHeight),
+                    orientation: {
+                        heading: camera.heading,
+                        pitch: camera.pitch,
+                        roll: camera.roll
+                    }
+                    });
+                }
+                } else {
+                // ❌ 不在可拖拽高度:禁止平移,强制回正到目标点
+                const correctedPosition = Cesium.Cartesian3.fromDegrees(
+                    targetLon,
+                    targetLat,
+                    currentHeight // 保留当前缩放高度
+                );
+
+                camera.setView({
+                    destination: correctedPosition,
+                    orientation: {
+                    heading: camera.heading,
+                    pitch: camera.pitch,
+                    roll: camera.roll
+                    }
+                });
+                }
+            });
+        }
+    },
+    coverOnChange(val) {
+      if (val.value === "风场") {
+        this.switchWindLayer(val.check);
+      } else if (val.value === "云层") {
+        this.switchCloudLayer(val.check);
+      } else if (val.value === "降雨") {
+        this.switchRainLayer(val.check);
+      } else if (val.value === "温度") {
+        this.switchTemperatureLayerr(val.check);
+      }
+    },
+    // 提供控制函数以便在需要时停止循环
+    stopCycling(intervalId) {
+      if (intervalId) {
+        clearInterval(intervalId);
+        intervalId = null;
+        console.log("循环已停止");
+      }
+    },
+    // 切换风场图显隐
+    switchWindLayer() {
+      this.viewer.scene.screenSpaceCameraController.enableZoom = true;
+      if (this.rainLayer || this.rainImagesLayer.length > 0) {
+        this.removeRainLayer();
+        this.stopCycling(this.rainintervalId);
+      }
+      if (this.cloudLayer || this.cloudImagesLayer.length > 0) {
+        this.removeCloudLayer();
+        this.stopCycling(this.cloudintervalId);
+      }
+      if (this.temperatureLayer || this.tempImagesLayer.length > 0) {
+        this.removeTemperatureLayer();
+        this.stopCycling(this.tempintervalId);
+      }
+      if (this.windLayer) {
+        this.removeWindLayer();
+      } else {
+        this.showWindLayer();
+      }
+    },
+    // 添加风场图
+    async showWindLayer() {
+      if (!this.windLayer) {
+        this.windLayer = new WindLayer(windGridData, { 
+          particleSize: 2.0,
+          particleOpacity: 0.6,
+          particleSpeed: 0.01,
+          maxVelocity: 25,// 风速最大值(用于颜色映射和速度缩放)
+          minVelocity: 0, // 风速最小值阈值(低于此值不显示粒子)
+          colorScale: [
+            "rgb(36,104, 180)",
+            "rgb(60,157, 194)",
+            "rgb(128,205,193)",
+            "rgb(151,218,168)",
+            "rgb(198,231,181)",
+            "rgb(238,247,217)",
+            "rgb(255,238,159)",
+            "rgb(252,217,125)",
+            "rgb(255,182,100)",
+            "rgb(252,150,75)",
+            "rgb(250,112,52)",
+            "rgb(245,64,32)",
+            "rgb(237,45,28)",
+            "rgb(220,24,32)",
+            "rgb(180,0,35)",
+          ],// 颜色强度缩放
+          frameRate: 15,
+          fadeOpacity: 0.995,
+          particleAge: 150,
+          maxAge: 60,
+          globalAlpha: 0.8,
+          velocityScale: 1 / 30,// 粒子移动速度缩放因子(控制动画快慢)
+          paths: 1000,
+          lineWidth: 2,
+        });
+        this.windLayer.addTo(this.viewer);
+      }
+    },
+
+    // 切换卫星云图显隐
+    switchCloudLayer(val) {
+      if (this.windLayer) {
+        this.removeWindLayer();
+      }
+      if (this.rainLayer || this.rainImagesLayer.length > 0) {
+        this.removeRainLayer();
+        this.stopCycling(this.rainintervalId);
+      }
+      if (this.temperatureLayer || this.tempImagesLayer.length > 0) {
+        this.removeTemperatureLayer();
+        this.stopCycling(this.tempintervalId);
+      }
+      if (!val || this.cloudLayer || this.cloudImagesLayer.length > 0) {
+        this.removeCloudLayer();
+        this.stopCycling(this.cloudintervalId);
+      } else {
+        this.showCloudLayer();
+      }
+    },
+    // 切换降雨图显隐
+    switchRainLayer() {
+      this.viewer.scene.screenSpaceCameraController.enableZoom = true;
+      if (this.windLayer) {
+        this.removeWindLayer();
+      }
+      if (this.cloudLayer || this.cloudImagesLayer.length > 0) {
+        this.removeCloudLayer();
+        this.stopCycling(this.cloudintervalId);
+      }
+      if (this.temperatureLayer || this.tempImagesLayer.length > 0) {
+        this.removeTemperatureLayer();
+        this.stopCycling(this.tempintervalId);
+      }
+      if (this.rainLayer || this.rainImagesLayer.length > 0) {
+        this.removeRainLayer();
+        this.stopCycling(this.rainintervalId);
+      } else {
+        this.showRainLayer();
+      }
+    },
+    // 切换温度图显隐
+    switchTemperatureLayerr() {
+      this.viewer.scene.screenSpaceCameraController.enableZoom = true;
+      if (this.windLayer) {
+        this.removeWindLayer();
+      }
+      if (this.cloudLayer || this.cloudImagesLayer.length > 0) {
+        this.removeCloudLayer();
+        this.stopCycling(this.cloudintervalId);
+      }
+      if (this.rainLayer || this.rainImagesLayer.length > 0) {
+        this.removeRainLayer();
+        this.stopCycling(this.rainintervalId);
+      }
+      if (this.temperatureLayer || this.tempImagesLayer.length > 0) {
+        this.removeTemperatureLayer();
+        this.stopCycling(this.tempintervalId);
+      } else {
+        this.showTemperatureLayer();
+      }
+    },
+    // 显示云图
+    showCloudLayer() {
+      const imageUrls = [];
+      cloudJson.forEach((it) => {
+        imageUrls.push("/public/static" + it.path);
       });
+      this.showeveryTypeImagesLayer(
+        imageUrls,
+        this.cloudintervalId,
+        this.cloudImagesLayer
+      );
+    },
+    //显示降雨图
+    showRainLayer() {
+      const imageUrls = [];
+      rainJson.forEach((it) => {
+        imageUrls.push("/public/static" + it.path);
+      });
+      this.showeveryTypeImagesLayer(
+        imageUrls,
+        this.rainintervalId,
+        this.rainImagesLayer
+      );
+      this.csceneElliposid(this.viewer, "rain");
+    },
+    //显示温度图
+    showTemperatureLayer() {
+      const imageUrls = [];
+      tempJson.forEach((it) => {
+        imageUrls.push("/public/static" + it.path);
+      });
+      this.showeveryTypeImagesLayer(
+        imageUrls,
+        this.tempintervalId,
+        this.tempImagesLayer
+      );
+      this.csceneElliposid(this.viewer, "temp");
+    },
+    async showeveryTypeImagesLayer(imageUrls, intervalId, ImagesLayers) {
+      // 存储所有图片图层的数组
+      let imageLayers = [];
+      // 当前显示的图片索引
+      let currentImageIndex = -1; // 初始为-1,表示没有图片显示
+
+      // 创建所有图片图层并添加到Viewer,初始时全部隐藏
+      await imageUrls.forEach((url) => {
+        const provider = new Cesium.SingleTileImageryProvider({
+          url: url,
+          // url: URL.createObjectURL(url),
+          rectangle: Cesium.Rectangle.fromDegrees(-180.0, -90.0, 180.0, 90.0), // 全球覆盖
+          tileWidth: 1440, // 根据你的图片实际宽度修改
+          tileHeight: 721,
+          // 如果你的图片只覆盖特定区域,请修改rectangle参数
+        });
+        const Layer = this.viewer.imageryLayers.addImageryProvider(provider);
+        Layer.alpha = 0.8; // 透明度
+        Layer.brightness = 1; // 亮度
+        Layer.contrast = 1; // 对比度
+        Layer.show = false; // 初始隐藏
+        imageLayers.push(Layer);
+        ImagesLayers.push(Layer);
+      });
+      function showNextImage() {
+        // 隐藏当前图片
+        if (currentImageIndex >= 0 && currentImageIndex < imageLayers.length) {
+          imageLayers[currentImageIndex].show = false;
+        }
+
+        // 计算下一张图片的索引
+        currentImageIndex = (currentImageIndex + 1) % imageLayers.length;
+
+        // 显示下一张图片
+        imageLayers[currentImageIndex].show = true;
+        // imageLayers[currentImageIndex + 1].show = true;
+        console.log("当前显示图片: " + imageUrls[currentImageIndex]);
+      }
+
+      // 设置切换间隔(毫秒),例如每5秒切换一次
+      const intervalMs = 5000;
+      intervalId = setInterval(showNextImage, intervalMs);
+
+      // 初始显示第一张图片
+      showNextImage();
+    },
+    // 移除风场图
+    removeWindLayer() {
+      if (this.windLayer) {
+        // this.windLayer.destroy();
+        this.windLayer.remove();
+        this.windLayer = null;
+      }
+    },
+
+    // 移除卫星云图
+    removeCloudLayer() {
+      if (this.cloudLayer) {
+        this.tagMsg = null;
+        this.viewer.imageryLayers.remove(this.cloudLayer);
+        this.cloudLayer = null;
+      }
+      if (this.cloudImagesLayer.length > 0) {
+        this.cloudImagesLayer.forEach((it) => {
+          this.viewer.imageryLayers.remove(it);
+        });
+        this.cloudImagesLayer = [];
+      }
+
+      if (this.imageryProviderV) {
+        this.viewer.imageryLayers.remove(this.imageryProviderV);
+        this.imageryProviderV = null;
+      }
+    },
+    // 移除降雨图
+    removeRainLayer() {
+      if (this.rainLayer) {
+        this.tagMsg = null;
+        this.viewer.imageryLayers.remove(this.rainLayer);
+        this.rainLayer = null;
+        this.setMapImageryProvider();
+        this.handlerAction.removeInputAction(
+          Cesium.ScreenSpaceEventType.LEFT_CLICK
+        );
+      }
+      if (this.rainImagesLayer.length > 0) {
+        this.rainImagesLayer.forEach((it) => {
+          this.viewer.imageryLayers.remove(it);
+        });
+        this.rainImagesLayer = [];
+      }
+
+      if (this.imageryProviderV) {
+        this.viewer.imageryLayers.remove(this.imageryProviderV);
+        this.imageryProviderV = null;
+      }
+    },
+    // 移除温度图
+    removeTemperatureLayer() {
+      if (this.temperatureLayer) {
+        this.tagMsg = null;
+        this.viewer.imageryLayers.remove(this.temperatureLayer);
+        this.temperatureLayer = null;
+        this.setMapImageryProvider();
+        this.handlerAction.removeInputAction(
+          Cesium.ScreenSpaceEventType.LEFT_CLICK
+        );
+      }
+      if (this.tempImagesLayer.length > 0) {
+        this.tempImagesLayer.forEach((it) => {
+          this.viewer.imageryLayers.remove(it);
+        });
+        this.tempImagesLayer = [];
+      }
+      if (this.imageryProviderV) {
+        this.viewer.imageryLayers.remove(this.imageryProviderV);
+        this.imageryProviderV = null;
+      }
+    },
+
+    //取消所有图层加载
+    cancleAllLayer() {
+      if (this.windLayer) {
+        this.removeWindLayer();
+      }
+      if (this.rainLayer || this.rainImagesLayer.length > 0) {
+        this.removeRainLayer();
+        this.stopCycling(this.rainintervalId);
+      }
+      if (this.cloudLayer || this.cloudImagesLayer.length > 0) {
+        this.removeCloudLayer();
+        this.stopCycling(this.cloudintervalId);
+      }
+      if (this.temperatureLayer || this.tempImagesLayer.length > 0) {
+        this.removeTemperatureLayer();
+        this.stopCycling(this.tempintervalId);
+      }
     },
     switchLayer() {
       this.$router.push({
@@ -781,6 +1256,7 @@ export default {
     menuComTSty(val) {
       this.menuComTStyB = val;
     },
+
   },
 };
 </script>

+ 353 - 34
src/views/cesiumComponents/windView.vue

@@ -1,26 +1,144 @@
 <template>
     <div class="windView">
-        <aside class="sidebar-left-top">
+        <!-- <aside class="sidebar-left-top">
             <div class="stat-block-lefttop" @click="backStations">
                 <p class="label">返回</p>
             </div>
-        </aside>
+        </aside> -->
         <!-- Left Sidebar -->
         <aside class="sidebar-left panel">
             <div class="stat-block">
                 <p class="label">总装机容量:</p>
-                <p class="value">2541<span style="font-size: 18px; font-weight: 400; color: #fff; margin-left: 4px;">MW</span></p>
+                <p class="value">2541<span style="font-size: 18px; font-weight: 400; color: #6c757d; margin-left: 4px;">MW</span></p>
                 <!-- <div class="progress-bar"><div class="progress-bar-inner" style="width: 100%;"></div></div> -->
             </div>
             <div class="stat-block" style="display: flex;justify-content: space-between;">
-                <p><span class="labels">风电 </span><span class="values">1245<span style="font-size: 14px; font-weight: 400; color: #fff; margin-left: 4px;">MW</span></span></p>
-                <p><span class="labels">光伏 </span><span class="values">1296<span style="font-size: 14px; font-weight: 400; color: #fff; margin-left: 4px;">MW</span></span></p>
+                <p><span class="labels">风电 </span><span class="values">1245<span style="font-size: 14px; font-weight: 400; color: #6c757d; margin-left: 4px;">MW</span></span></p>
+                <p><span class="labels">光伏 </span><span class="values">1296<span style="font-size: 14px; font-weight: 400; color: #6c757d; margin-left: 4px;">MW</span></span></p>
             </div>
             <div class="stat-block" style="margin-bottom: 0;">
                 <p class="label">安全天数:</p>
                 <p class="value">1258天</p>
             </div>
+            
+        </aside>
+        <aside class="sidebar-left2 panel" v-if="showWindStatus">
+            <div class="stat-block2" v-if="showWeather">
+                <span class="labels">数据 </span>
+                <span class="values">{{showCover}} @ {{showHeight}}hpa </span>
+            </div>
+            <div class="stat-block2" v-if="showWeather">
+                <span class="labels">模式 </span>
+                <span class="covercheck">
+                    <el-check-tag v-for="(it, index) in windmodelArr" :key="index" type="primary"
+                    :disabled="it.disabled"
+                     :checked="it.check">{{it.value}}</el-check-tag>
+                </span>
+            </div>
+            <div class="stat-block2" v-if="showWeather">
+                <span class="labels">范围 </span>
+                <span class="values">0.0m/s</span>
+                <span class="valuess"></span>
+                <span class="values">100.0m/s</span>
+            </div>
+            <div class="stat-block2" v-if="showWeather">
+                <span class="labels">高度 </span>
+                <span class="values">地表 </span>
+                <span class="heightcheck">
+                    <el-check-tag v-for="(it, index) in heightArr" :key="index" type="primary"
+                     :checked="it.check" @change="valueOnChange(it)">{{it.value}}</el-check-tag>
+                </span>
+                <span class="values">hpa </span>
+            </div>
+            <div class="stat-block2" v-if="showWeather">
+                <span class="labels">覆盖模式 </span>
+                <span class="covercheck">
+                    <el-check-tag v-for="(it, index) in coverArr" :key="index" type="primary"
+                    :disabled="it.disabled"
+                     :checked="it.check" @change="coverOnChange(it)">{{it.value}}</el-check-tag>
+                </span>
+            </div>
+            <div class="stat-block2">
+                <span class="labels">
+                    <span style="font-size: 15px; color: #6c757d;font-weight: 600;position: relative;top:20px">场站类型</span>
+                </span>
+                <div style="display: flex;width:405px">
+                    <div class="windStatus">
+                        <img :src="bw" style="width:60px;height:60px;">
+                        <p class="values windVal">并网</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="dj" style="width:60px;height:60px;">
+                        <p class="values windVal">待机</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="gz" style="width:60px;height:60px;">
+                        <p class="values windVal">故障</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="jx" style="width:60px;height:60px;">
+                        <p class="values windVal">检修</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="xd" style="width:60px;height:60px;">
+                        <p class="values windVal">限电</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="lx" style="width:60px;height:60px;">
+                        <p class="values windVal">离线</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="sl" style="width:60px;height:60px;">
+                        <p class="values windVal">受累</p>
+                    </div>
+                </div>
+            </div>
         </aside>
+        <!-- <aside class="sidebar-left2 panel" v-if="showWindStatus">
+            <div v-if="showWeather">
+                <span class="labels">覆盖模式 </span>
+                <div class="stat-block">
+                    <span class="covercheck">
+                        <el-check-tag v-for="(it, index) in coverArr" :key="index" type="primary"
+                        :disabled="it.disabled"
+                        :checked="it.check" @change="coverOnChange(it)">{{it.value}}</el-check-tag>
+                    </span>
+                </div>
+            </div>
+            <div>
+                <span class="labels" style="">风机状态类型 </span>
+                <div class="stat-block" style="display: flex">
+                    <div class="windStatus">
+                        <img :src="bw" style="width:60px;height:60px;">
+                        <p class="values windVal">并网</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="dj" style="width:60px;height:60px;">
+                        <p class="values windVal">待机</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="gz" style="width:60px;height:60px;">
+                        <p class="values windVal">故障</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="jx" style="width:60px;height:60px;">
+                        <p class="values windVal">检修</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="xd" style="width:60px;height:60px;">
+                        <p class="values windVal">限电</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="lx" style="width:60px;height:60px;">
+                        <p class="values windVal">离线</p>
+                    </div>
+                    <div class="windStatus">
+                        <img :src="sl" style="width:60px;height:60px;">
+                        <p class="values windVal">受累</p>
+                    </div>
+                </div>
+            </div>
+        </aside> -->
         <!-- Right Sidebar -->
         <aside class="sidebar-right panel">
             <div class="info-section">
@@ -433,7 +551,7 @@
                                     : 'background-color:#05BB4C'
                                 "
                             ></span>
-                            <span>{{ item[0].total }}</span>
+                            <span  style="color:#606769">{{ item[0].total }}</span>
                             </div>
                             <list-bar-chart-2-home
                             :list="item"
@@ -540,7 +658,7 @@
                                         : 'background-color:#05BB4C'
                                     "
                                 ></span>
-                                <span style="color:#fff">{{ item[0].total }}</span>
+                                <span style="color:#606769">{{ item[0].total }}</span>
                             </div>
                             <list-bar-chart-2-home
                             :list="item"
@@ -566,14 +684,127 @@ import ListBarChart2Home from "@/components/windNeedCharts/list-bar-chart2-home.
 import PieChart from "@/components/windNeedCharts/pieChart.vue";
 import dataJson from "./mapdataJson.json"
 import dataJson2 from "./dataJson.json"
+//并网
+import bw from "@/assets/windimgs/fanSvg/bw.svg"
+//故障
+import gz from "@/assets/windimgs/fanSvg/gz.svg"
+//待机
+import dj from "@/assets/windimgs/fanSvg/dj.svg"
+//检修
+import jx from "@/assets/windimgs/fanSvg/jx.svg"
+//限电
+import xd from "@/assets/windimgs/fanSvg/xd.svg"
+//离线
+import lx from "@/assets/windimgs/fanSvg/lx.svg"
+//受累
+import sl from "@/assets/windimgs/fanSvg/sl.svg"
 export default {
     components: {
         PowerReviewHome,
         ListBarChart2Home,
         PieChart
     },
+    props: {
+        showWeather: {
+            type: Boolean,
+            default: false
+        },
+    },
     data() {
         return {
+            showWindStatus: true,
+            bw,
+            gz,
+            jx,
+            dj,
+            xd,
+            lx,
+            sl,
+            windmodelArr: [
+                {
+                    value: "大气层",
+                    check: false,
+                    disabled: true
+                },
+                {
+                    value: "地表层",
+                    check: true
+                },
+            ],
+            showHeight: 1000,
+            heightArr: [
+                {
+                    value: 1000,
+                    check: true
+                },
+                {
+                    value: 850,
+                    check: false
+                },
+                {
+                    value: 700,
+                    check: false
+                },
+                {
+                    value: 500,
+                    check: false
+                },
+                {
+                    value: 250,
+                    check: false
+                },
+                {
+                    value: 70,
+                    check: false
+                },
+                {
+                    value: 10,
+                    check: false
+            }],
+            showCover: "风场",
+            coverArr: [
+                {
+                    value: "风场",
+                    check: false
+                },
+                {
+                    value: "云层",
+                    check: false
+                },
+                {
+                    value: "降雨",
+                    check: false
+                },
+                {
+                    value: "温度",
+                    check: false
+                },
+                {
+                    value: "湿度",
+                    check: false,
+                    disabled: true
+                },
+                {
+                    value: "3小时累计降雨量",
+                    check: false,
+                    disabled: true
+                },
+                {
+                    value: "水汽含量",
+                    check: false,
+                    disabled: true
+                },
+                {
+                    value: "云中总水量",
+                    check: false,
+                    disabled: true
+                },
+                {
+                    value: "平均海平面压力",
+                    check: false,
+                    disabled: true
+                }
+            ],
             activeTab: -1,
             wpIds: "KGDL_FGS0",
             powerDataHome: {},
@@ -596,8 +827,26 @@ export default {
         backStations() {
             this.$emit("backStations")
         },
+        valueOnChange(it) {
+            this.heightArr.forEach(it => {
+                it.check = false
+            })
+            it.check = true
+            this.showHeight = it.value
+        },
+        coverOnChange(itv) {
+            this.coverArr.forEach(it => {
+                if (itv === it) {
+                    it.check = !it.check
+                } else {
+                    it.check = false
+                }
+            })
+            this.$emit("coverOnChange", itv)
+        },
         showDetail() {
             this.showWindDetail = !this.showWindDetail
+            this.showWindStatus = !this.showWindStatus
             this.findProjectPlan();
             this.$emit("showDetail", this.showWindDetail)
         },
@@ -794,12 +1043,13 @@ export default {
 
 <style lang="less" scoped>
 .panel {
-    backdrop-filter: blur(10px);
-    -webkit-backdrop-filter: blur(10px);
+    background: rgba(248, 249, 252, 0.85);
+    backdrop-filter: blur(15px);
+    -webkit-backdrop-filter: blur(15px);
     border: 1px solid rgba(255, 255, 255, 0.2);
     border-radius: 12px;
+    box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.08);
     padding: 20px;
-    background: rgba(255, 255, 255, 0.15);
 }
 
 /* --- Left Sidebar --- */
@@ -818,7 +1068,7 @@ export default {
     background: rgba(255, 255, 255, 0.15);
 }
 .sidebar-left{
-    top: 150px;
+    top: 100px;
     width: 260px;
 }
 
@@ -831,12 +1081,12 @@ export default {
 }
 
 .stat-block { margin-bottom: 15px; }
-.stat-block .label { font-size: 26px; color: #fff; margin-bottom: 5px; }
+.stat-block .label { font-size: 26px; color: #6c757d; margin-bottom: 5px; }
 .stat-block .value { font-size: 32px; font-weight: 600; color: #4b55ae; }
-.stat-block .labels { font-size: 14px; color: #fff; margin-bottom: 5px; }
+.stat-block .labels { font-size: 14px; color: #6c757d; margin-bottom: 5px; }
 .stat-block .values { font-size: 16px; font-weight: 600; color: #4b55ae; }
 .progress-bar { height: 4px; background: #e9ecef; border-radius: 2px; margin-top: 10px; }
-.progress-bar-inner { height: 100%; background: #fff; border-radius: 2px; }
+.progress-bar-inner { height: 100%; background: #6c757d; border-radius: 2px; }
 
 /* --- Right Sidebar --- */
 .sidebar-right {
@@ -849,7 +1099,7 @@ export default {
     flex-direction: column;
     gap: 20px;
     .info-section{
-        h3 { font-size: 16px; font-weight: 600; text-transform: uppercase; color: #fff; margin-bottom: 5px; }
+        h3 { font-size: 16px; font-weight: 600; text-transform: uppercase; color: #6c757d; margin-bottom: 5px; }
     }
     .energy-system-content {
         padding: 5px 5px 15px 5px;
@@ -871,7 +1121,7 @@ export default {
         margin-left: 5px;
         }
         .title {
-        color: #fff;
+        color: #6c757d;
         
         text-align: right;
         .title-name {
@@ -896,7 +1146,7 @@ export default {
             span {
                 font-size: 12px;
                 font-weight: 400;
-                color: #fff;
+                color: #6c757d;
             }
             span:nth-child(3) {
                 font-size: 19px;
@@ -917,7 +1167,7 @@ export default {
                 .el-col:nth-child(1) {
                 font-size: 12px;
                 font-weight: 400;
-                color: #fff;
+                color: #6c757d;
                 }
                 .el-col:nth-child(2) {
                 font-size: 16px;
@@ -927,7 +1177,7 @@ export default {
                 .el-col:nth-child(3) {
                 font-size: 14px;
                 font-weight: 400;
-                color: #fff;
+                color: #6c757d;
                 }
             }
             }
@@ -972,7 +1222,7 @@ export default {
           font-size: 16px; 
             font-weight: 600; 
             text-transform: uppercase;
-          color: #ffffff;
+          color: #6c757d;
         }
 
         .unit {
@@ -1014,7 +1264,7 @@ export default {
 
           .save-value {
             font-size: 16px;
-            color: #ffffff;
+            color: #6c757d;
             margin: 10px 0;
           }
 
@@ -1026,6 +1276,75 @@ export default {
       }
     }
 }
+.sidebar-left2{
+    position: absolute;
+    left: 20px;
+    bottom: 20px;
+    width: 500px;
+    .windStatus{
+        display: flex;
+        flex-direction: column;
+        .windVal{
+            position:relative;
+            top: 5px; 
+            left: 10px;
+        }
+    }
+    .covercheck{
+        display: inline-block;
+        width: 100%;
+        .el-check-tag{
+            margin: 0 5px 3px 0;
+            padding: 5px 8px;
+        }
+    }
+}
+.stat-block2 {
+    margin-bottom: 10px;
+    display: flex;
+    .labels { 
+        font-size: 15px; 
+        color: #6c757d; 
+        width: 40px;
+        font-weight: 600;
+        display: block;
+        border-right: 2px solid #6c757d; 
+    }
+    .values { 
+        font-size: 15px; 
+        font-weight: 600; 
+        color: #4b55ae;
+        margin-left: 8px; 
+    }
+    .valuess{ 
+        margin-left: 5px; 
+        display: inline-block; 
+        width: 230px; 
+        height: 10px; 
+        background: 
+        linear-gradient(90deg, rgb(36,104, 180), rgb(60,157, 194), rgb(151,218,168), rgb(198,231,181), rgb(238,247,217),
+        rgb(255,238,159), rgb(252,217,125), rgb(255,182,100), rgb(252,150,75), rgb(250,112,52), rgb(245,64,32), 
+        rgb(237,45,28), rgb(220,24,32), rgb(180,0,35));
+        position: relative; 
+        top: 6px;
+    }
+    .heightcheck, .covercheck{
+        display: inline-block;
+        margin-left: 5px;
+        .el-check-tag{
+            padding: 5px 8px;
+            margin-right: 3px;
+        }
+    }
+    .covercheck{
+        width: 380px;
+        margin-left: 5px;
+        .el-check-tag{
+            margin: 0 2px 3px 0;
+            margin-right: 5px;
+        }
+    }
+}
 
 /* --- Bottom Bar --- */
 .bottom-bar {
@@ -1058,7 +1377,7 @@ export default {
         .power-name {
             width: 80px;
             margin-bottom: 20px;
-            color: #fff;
+            color: #6c757d;
         }
 
         .power-item {
@@ -1077,7 +1396,7 @@ export default {
                     height: 5px;
                     border-radius: 5px;
                     display: inline-block;
-                    background-color: #fff;
+                    background-color: #6c757d;
                     margin-right: 5px;
                 }
 
@@ -1118,7 +1437,7 @@ export default {
 
                 .amount-nums {
                     font-size: 12px;
-                    color: #fff;
+                    color: #6c757d;
                     margin-left: 10px;
                     display: flex;
                     flex-direction: row;
@@ -1126,7 +1445,7 @@ export default {
 
                     .num-item {
                         font-size: 20px;
-                        color: #ffffff;
+                        color: #6c757d;
                         margin-right: 5px;
                     }
                 }
@@ -1136,7 +1455,7 @@ export default {
                 display: flex;
                 align-items: baseline;
                 font-size: 14px;
-                color: #fff;
+                color: #6c757d;
 
                 .nums {
                     font-size: 20px;
@@ -1201,7 +1520,7 @@ export default {
 
                 .type-num {
                     height: 15px;
-                    color: #fff;
+                    color: #6c757d;
                 }
             }
         }
@@ -1240,7 +1559,7 @@ export default {
   font-size: 14px;
   font-family: Microsoft YaHei;
   font-weight: 400;
-  color: #ffffff;
+  color: #6c757d;
 }
 .status-title {
   width: 100%;
@@ -1248,7 +1567,7 @@ export default {
   flex-direction: row;
   align-items: center;
   justify-content: space-between;
-  h3 { font-size: 16px; font-weight: 600; text-transform: uppercase; color: #fff; margin-bottom: 5px; }
+  h3 { font-size: 16px; font-weight: 600; text-transform: uppercase; color: #6c757d; margin-bottom: 5px; }
 }
 
 .date {
@@ -1273,7 +1592,7 @@ export default {
 
     &.active {
       background: rgba(5, 102, 187, 0.4);
-      color: #ffffff;
+      color: #fff;
     }
   }
 
@@ -1289,7 +1608,7 @@ export default {
 
     &.active {
       background: rgba(5, 102, 187, 0.4);
-      color: #ffffff;
+      color: #fff;
     }
   }
 
@@ -1305,7 +1624,7 @@ export default {
 
     &.active {
       background: rgba(5, 102, 187, 0.4);
-      color: #ffffff;
+      color: #fff;
     }
   }
 }
@@ -1317,6 +1636,6 @@ export default {
 .info-section { font-size: 13px; }
 .info-section h3 { font-size: 12px; font-weight: 600; text-transform: uppercase; color: #6c757d; margin-bottom: 15px; }
 .info-item { display: flex; justify-content: space-between; margin-bottom: 12px; padding: 0 5px; }
-.info-item .label { color: #fff; }
-.info-item .value { color: #fff; display: flex; align-items: center; gap: 5px; }
+.info-item .label { color: #6c757d; }
+.info-item .value { color: #6c757d; display: flex; align-items: center; gap: 5px; }
 </style>

+ 15 - 6
src/views/weatherComponents/cesiumweatherView.vue

@@ -43,7 +43,7 @@
             </div>
             <div class="stat-block">
                 <span class="labels">场站类型 </span>
-                <el-checkbox-group v-model="checkList" class="checkTypeGroup" @change="changeType">
+                <el-checkbox-group v-model="checkList" class="checkTypeGroup">
                     <el-checkbox label="Wind" value="Wind">
                         <img :src="fc" style="width:30px;height:30px;">
                         <span class="values" style="position:relative;top:-10px; margin-right: 3px">风电</span>
@@ -207,6 +207,10 @@ export default {
             type: Object,
             default: () => null
         },
+        stationValue: {
+            type: Array,
+            default: () => []
+        },
     },
     components: {
         devBox,
@@ -218,7 +222,6 @@ export default {
             hd,
             gf,
             chu,
-            checkList: ['Wind', 'Fire', 'Solar', 'Storage'],
             showWeather: false,
             valuechecked: false,
             showWeatherDetail: false,
@@ -330,14 +333,20 @@ export default {
             weatherSvg: ['晴', '多云', '风', '雾', '阴', '雷雨', '雨', '雨加雪', '雪']
         }
     },
+    computed: {
+        checkList: {
+            get() {
+                return this.stationValue; // 从父组件 props 获取值
+            },
+            set(val) {
+                this.$emit('changeType', val); // 向父组件通知变更
+            },
+        },
+    },
     mounted() {
         this.today = DAYJS().format("YYYY年MM月DD日")
     },
     methods: {
-        changeType(value) {
-            console.log('checkList===>>>', value)
-            this.$emit("changeType", value)
-        },
         valueOnChange(it) {
             this.heightArr.forEach(it => {
                 it.check = false