From 74d661c8a7119cd6df4fd887115381ce84eb5fb0 Mon Sep 17 00:00:00 2001 From: zhangquan <2523589960@qq.com> Date: Sat, 19 Jul 2025 16:18:18 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0=E6=B0=94=E8=B1=A1=E6=95=88?= =?UTF-8?q?=E6=9E=9C=EF=BC=88=E4=B8=8B=E9=9B=A8=E3=80=81=E4=B8=8B=E9=9B=AA?= =?UTF-8?q?=E3=80=81=E8=B5=B7=E9=9B=BE=EF=BC=89=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=B8=E5=85=B3=E9=A1=B5=E9=9D=A2=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A0=8F=E4=BA=A4=E4=BA=92=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icons/toolbar_fog.png | Bin 0 -> 1070 bytes src/assets/icons/toolbar_rain.png | Bin 0 -> 898 bytes src/assets/icons/toolbar_snow.png | Bin 0 -> 1670 bytes src/assets/icons/toolbar_sunny.png | Bin 0 -> 1078 bytes .../mixins/useWeatherParticle/fog.js | 74 +++++++++++++++ .../mixins/useWeatherParticle/index.js | 54 +++++++++++ .../mixins/useWeatherParticle/rain.js | 86 ++++++++++++++++++ .../mixins/useWeatherParticle/snow.js | 86 ++++++++++++++++++ .../forestFire/Toolbar/Toolbar.vue | 45 ++++++++- 9 files changed, 344 insertions(+), 1 deletion(-) create mode 100644 src/assets/icons/toolbar_fog.png create mode 100644 src/assets/icons/toolbar_rain.png create mode 100644 src/assets/icons/toolbar_snow.png create mode 100644 src/assets/icons/toolbar_sunny.png create mode 100644 src/components/CesiumMap/mixins/useWeatherParticle/fog.js create mode 100644 src/components/CesiumMap/mixins/useWeatherParticle/index.js create mode 100644 src/components/CesiumMap/mixins/useWeatherParticle/rain.js create mode 100644 src/components/CesiumMap/mixins/useWeatherParticle/snow.js diff --git a/src/assets/icons/toolbar_fog.png b/src/assets/icons/toolbar_fog.png new file mode 100644 index 0000000000000000000000000000000000000000..695d5463255dcf369d383b73fe649ea394cc9546 GIT binary patch literal 1070 zcmV+}1kwA6P)kmWy$Af%Gad%HXD^u2F) zIp==wxmR$5hs-4Ypr>5{aQ|f&#myr8ntV(fprkrae4Js(lmhwQtPCX&4@@7x*QKHu zF+mB?Pk;^oTY&ApE+lNwmz6*2A!930^0dSk1*W!pUKVSf7pc@wELm1ypsbIp-~i`W z(k>RP6FD386%SC>QzBRq8Y;dZ#EbP1ANabcqWC#9QEcta$y?Vzj_bpy;4p*aLc0_m z?M=(KtpUdM5$1fDhVB%^=a;g0IjZ!{s+n8;;5WeOV0pU=IXN12Tw-wgIK*c+O+kJ} z$Te0=V2lPleS-fE@{=~dnZ;}Qtn9QA+D_H<6%S`w`gUhhq{9UlJt9P{8%=isAy(1; zYkpFJ;?=&Kd=#BOq&k0M9J4#p7>O>Csm?4PKQP)Nl5gsD<-JDWEw>>d?nMfB=G$<> zWI%y-GNny)_#}05+oVh|#y=;S@ir>mR1Ji1ZUH*hi+=A5+?g|gz5bz;B`;!2jEu+)mD!_oR&mmwYkr6l;?Q><1c~mOv zIXa)q8E+R{*%Ifx=;;Eg{&({(C0N|!$}hz+eZZ;U*{D6MSH3HQ?MApEz>u#?sPfS` zr?j|lb_Rc6^ucPA*ujc?M!s*99V>O3PVXV;3k2QGPI!jj=hxd)xa)a-6hi0<(o@b}Uf-)jl*;ngKzZ(qz4eNK&`gY(Sd z*AUXvFRAd`xeWb{1jZve$0K^5YAWqGm7csSBimHxradf-`gPhc(bIY@DtVS zMGq@&#FNy9=gG0SL#+m&zpS6O30_L-+|vGiR_@Ju+Zq6B;X7(!xuwHIW)$6iuKCkV z0S3o(xmNI0BF~n_fnb;Qg{11!bU*d5)-r~LnK>H+P+BC);VmF|CpxVac!2Q+x%=+D(xR^X1JmsX_$vANuO%opPU5 o1!fX7>0IjzNm9qQ_BR~hKPPu`Fg;~^6aWAK07*qoM6N<$g5LxWlK=n! literal 0 HcmV?d00001 diff --git a/src/assets/icons/toolbar_rain.png b/src/assets/icons/toolbar_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..0068e57fdd1e538711bb8b97779bc31c178011fc GIT binary patch literal 898 zcmV-|1AY97P)bjqvM!8&w_B*7f_QUsM5EKNF5EL0vLLFQ&a%R_=*PGd$b!YtV%q)AbpamKCKkwuBe((4GZxL4bgDadL z{yhL%Hnt0_Tq_c^F#JYla2n8@tgVqBoI=c1%4lQ;hKN?1I*fDDy}~3W%zy+PY7!?Z z0TBtnAW<_J@Pq@mc!JyBv~E0fUv>%0@+%4$0p;LfScWjKg)p$1u&@7Ev~9FU#(T9 zZu^}JV;P(bA$0XBct->x5P+5?Ry>Tc(MHGF*Yk3E5WysZ%e_gw=m#MLpb@Q=Sn-U! z*msYkO^2PO(hune)nxK%soOFD{X`8(1D7;R7 zwbJ7J_RHH~v1lbrNkT&x;xE_U!@y88H7dKCB6)?Hsa2qpCMl2J<%631+hVd+?l8VLhY7X_IZ^8+qnAQfdEE{5*Y(tvC($N zu+mvCGT=Hpgv@{mZE799^#c~(gwF2ILYlA769^WwDjrI4_3kVdLyss5oI8y;E3yyV z1viM+EoR{)1KG({)O!Qi<7tm+;o*MeC$H`w%-n0M2JVKf<{(b=bYv?vp zI;$qo*$-EV>T7hE!WbNLuhapecFBM%>lN5?6w&Dm``zcqM_$3_gGdTxfUoB_tbutB zwBHUipwlLn`CB=lgywCe1Y{D3amMcIA@=+-xNQl8F<@@0N`IzQ#=pV0~j!9 zG)|D|E@?qrhxbw)9PcsnTa9hnnSuTd3T$>;kY14P5tyH~P;s5{u07*qoM6N<$f)%xvN&o-= literal 0 HcmV?d00001 diff --git a/src/assets/icons/toolbar_snow.png b/src/assets/icons/toolbar_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..aa177829417ef56ee473a416be8b7649dda2d695 GIT binary patch literal 1670 zcmV;126_33P)>XeW3IPkKAP*_1DA7P5AgK`oC?tk6Ay`cyfncERLB&`!1=L`%*A`lN zBx-=f7{Oo!!?RF{B8@Q;!b3ru3KkR*QjFa0_IAhb-@B{Va$ZY~VUufj|9>9eKl9DZ z&vcs~zRmvWKLMz)hn9Qxk@L}KO~j`_C=Q+`E_=kLp-lBY54gH;x` zLYn5kNH!hCcdf0{Os_!)kkD~NPGh024OY%8O=qE_YrB^+U-&mL839xnvJQ%iS);Lq zey*>G$t;S|4mcI8731_3ct4D@`rv$m2sJU&L`0;a(v;b@(8n6l27E8-5`c&)D`0#z zoK%DZ99BlkO_{3+ZN-`m^j<7o!>^Y(^fR0EL{TqpRB{zj*#c1ckb4Qb?{*qML?q}T z>QlgczTA?rnnPd1$Y~fEnKT0SKaX5*Aps-eh14KAO++;`C1oN}xrAu+gRLP;0{l~@ zA;Sv;{6l*nH>CiI-#{@JcHi>&>7AHKe?X|aN2h^Hn15*nVaghSSPr=;`!5eFq%%o08D8G za2){rE&#U-lk1yAd^b!wgYWwjYb_F^YO6b~e1*BW!xW(Ov|cUrh~v;?Va{ifQBXn@ ziIC4tD7h8On6ID@j032nAYU!`@uV^g(#`~F%awBl8iydU=}+*rj>%I;Syb0tLdQ#2 zvXcbTCIt~gB3PJ*%`7FLq&!Rp(r^g|??p+W0H_)2s{%f%H;@9=2S}#^GN>kzXBDv@ z)jE3+{uoUJPk=q~2z^x)bPicEF;kAoVP8WC~>Vf&+8XrU1SFZ5UkugV~ADsxumxKEJ~JK&*Qd z38B0?=!qUP?4V1+ET%$uu1o=U4l-YehA25S9x`YpiJnQc4`n+wEdaHs$}qcyMuX{- zp_q@Q2bHc3=pN$DD8rK0GE7Xvc4ese;ZDQEJXV0~@H-4ZbzvW!NFCK_r(vW;CZWr1 zWO5z=co!_(?+*u@e;SeM0}6oZ1Kr|%Ks~Av{bis7GToOrHSR66-qNXbIWu}f+vnz1 zY>3M9!bA!h6C+k#KIS2J?}WJ@sh^LPN^XyA^Hd#_ z$Ka>ZkppmNAu|l`swcfrlyFvV`fziywxxnk2O=W?ceGkGq)6v8yO5f51_lh%SU0y` zDn@QU2f1ot&WpfM24g^mIA`U9#Q@rP~hRZxpPnKhzfg Q_W%F@07*qoM6N<$g1zAMr2qf` literal 0 HcmV?d00001 diff --git a/src/assets/icons/toolbar_sunny.png b/src/assets/icons/toolbar_sunny.png new file mode 100644 index 0000000000000000000000000000000000000000..b05f08bf4aaa5d18f379e71b79dada644a800851 GIT binary patch literal 1078 zcmV-61j+k}P)FjFAb24Onm>Wj#iH%%;?Ir7CYF&dnVvIe=e$1OxaG`o&Y3^Nn?5)k=6v7#e9!m3 z&-=aa2wE69SC1=_g{%{-Y8FPCHB?o}dk7RD0kNCKX^Frf2@v4%5qKmX$a&hK3GDLQ zu=Zn-zoT4xKLi0okf`Z_ovKeJJ$xexe3r4~Y&qsbA;{g;?GSv*MZ>VMG9z*;ii8ni zk(2$7^hB-MtvYSe#Ssy7Q7;43OMfhZFK6jfg>jtVq9rsKE86JUBJxKwBKt!18Q;SX zw0)V+h-ahw6OoBn0%mfD>U7J)ak^(Qe_mD_omr8)<%T?&UG&jmzD=Ys_PI!*e11?h zEgsJBTRWd~#8^R$zrqKJ%mTx{;NcV(EL6dwtS#qZ;$FZzs@OoF6?~Egke-_4>u5r- zug}5(5z)M>?fia$-!CTZXJ6};-)~g&Vr&{3Po#Y;=(A*akLq0C#X-h$84wUFQ8g+g z_hZVz+7Csp4HR^7I)y8nL~cffu&#Sxz}Mx8Nqk3f&aF!eifcgq0FX(>@Tn9YwNc7CaDPJ#K%nhF*lUDni4W1UB-uw>}|OlH}<&Y~>7U(eNl~$HNJ3 z@)Aj$n&Dv8IuSQk1B0IK6V-Ke?GbMNX1LY**LdoW$q0c*S#aKuV#khnb{k1>-gs*Z zy}2uvK&dSU-kND4A7)!_m{Xkr4>w8R1_{iLbI)GYnXZRzcWms~D)L+1Sr7->2!S}9 wy6%B$0RIy(BFuUCg&H`YP0M=?r^uASJ^O^Zw1VyrWB>pF07*qoM6N<$f { + return this.visibility; + }, + fogColor: () => { + return this.color; + }, + }, + }); + this.viewer.scene.postProcessStages.add(this.fogStage); + } + + destroy() { + if (!this.viewer || !this.fogStage) return; + this.viewer.scene.postProcessStages.remove(this.fogStage); + const isDestroyed = this.fogStage.isDestroyed(); + // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错 + if (!isDestroyed) { + this.fogStage.destroy(); + } + delete this.visibility; + delete this.color; + } + + show(visible) { + this.fogStage.enabled = visible; + } + + fog() { + return "uniform sampler2D colorTexture;\n\ + uniform sampler2D depthTexture;\n\ + uniform float visibility;\n\ + uniform vec4 fogColor;\n\ + in vec2 v_textureCoordinates; \n\ + out vec4 fragColor;\n\ + void main(void) \n\ + { \n\ + vec4 origcolor = texture(colorTexture, v_textureCoordinates); \n\ + float depth = czm_readDepth(depthTexture, v_textureCoordinates); \n\ + vec4 depthcolor = texture(depthTexture, v_textureCoordinates); \n\ + float f = visibility * (depthcolor.r - 0.3) / 0.2; \n\ + if (f < 0.0) f = 0.0; \n\ + else if (f > 1.0) f = 1.0; \n\ + fragColor = mix(origcolor, fogColor, f); \n\ + }\n"; + } +} + +export default FogEffect; \ No newline at end of file diff --git a/src/components/CesiumMap/mixins/useWeatherParticle/index.js b/src/components/CesiumMap/mixins/useWeatherParticle/index.js new file mode 100644 index 0000000..c7141cc --- /dev/null +++ b/src/components/CesiumMap/mixins/useWeatherParticle/index.js @@ -0,0 +1,54 @@ +import * as Cesium from "cesium"; +import RainEffect from "./rain"; +import SnowEffect from "./snow"; +import FogEffect from "./fog"; + +export const useWeatherParticle = (viewer) => { + const _viewer = viewer; + let weather = null + + const destroy = () => { + if(weather) { + weather.destroy(); + weather = null; + } + }; + + const rain = () => { + destroy(); + + weather = new RainEffect(_viewer, { + tiltAngle: -0.2, //倾斜角度 + rainSize: 1.0, // 雨大小 + rainSpeed: 120.0, // 雨速 + }); + weather.show(true); + }; + + const snow = () => { + destroy(); + + weather = new SnowEffect(_viewer, { + snowSize: 0.02, // ❄️大小,最好小于0.02 + snowSpeed: 60.0, // 速度 + }); + weather.show(true); + }; + + const fog = () => { + destroy(); + + weather = new FogEffect(_viewer, { + visibility: 0.2, // 能见度 + color: new Cesium.Color(0.8, 0.8, 0.8, 0.3), + }); + weather.show(true); + }; + + return { + rain, + snow, + fog, + destroy, + } +}; diff --git a/src/components/CesiumMap/mixins/useWeatherParticle/rain.js b/src/components/CesiumMap/mixins/useWeatherParticle/rain.js new file mode 100644 index 0000000..39e8ebc --- /dev/null +++ b/src/components/CesiumMap/mixins/useWeatherParticle/rain.js @@ -0,0 +1,86 @@ +/* + * @Descripttion: 雨粒子效果 + * @Author: 笙痞 + * @Date: 2023-01-04 15:01:03 + * @LastEditors: 笙痞77 + * @LastEditTime: 2023-05-19 09:54:15 + */ +import * as Cesium from "cesium"; + +class RainEffect { + constructor(viewer, options) { + if (!viewer) throw new Error("no viewer object!"); + options = options || {}; + //倾斜角度,负数向右,正数向左 + this.tiltAngle = Cesium.defaultValue(options.tiltAngle, -0.6); + this.rainSize = Cesium.defaultValue(options.rainSize, 0.3); + this.rainSpeed = Cesium.defaultValue(options.rainSpeed, 60.0); + this.viewer = viewer; + this.init(); + } + + init() { + this.rainStage = new Cesium.PostProcessStage({ + name: "czm_rain", + fragmentShader: this.rain(), + uniforms: { + tiltAngle: () => { + return this.tiltAngle; + }, + rainSize: () => { + return this.rainSize; + }, + rainSpeed: () => { + return this.rainSpeed; + }, + }, + }); + this.viewer.scene.postProcessStages.add(this.rainStage); + } + + destroy() { + if (!this.viewer || !this.rainStage) return; + this.viewer.scene.postProcessStages.remove(this.rainStage); + const isDestroyed = this.rainStage.isDestroyed(); + // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错 + if (!isDestroyed) { + this.rainStage.destroy(); + } + delete this.tiltAngle; + delete this.rainSize; + delete this.rainSpeed; + } + + show(visible) { + this.rainStage.enabled = visible; + } + + rain() { + return "uniform sampler2D colorTexture;\n\ + in vec2 v_textureCoordinates;\n\ + uniform float tiltAngle;\n\ + uniform float rainSize;\n\ + uniform float rainSpeed;\n\ + float hash(float x) {\n\ + return fract(sin(x * 133.3) * 13.13);\n\ + }\n\ + out vec4 fragColor;\n\ + void main(void) {\n\ + float time = czm_frameNumber / rainSpeed;\n\ + vec2 resolution = czm_viewport.zw;\n\ + vec2 uv = (gl_FragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y);\n\ + vec3 c = vec3(.6, .7, .8);\n\ + float a = tiltAngle;\n\ + float si = sin(a), co = cos(a);\n\ + uv *= mat2(co, -si, si, co);\n\ + uv *= length(uv + vec2(0, 4.9)) * rainSize + 1.;\n\ + float v = 1. - sin(hash(floor(uv.x * 100.)) * 2.);\n\ + float b = clamp(abs(sin(20. * time * v + uv.y * (5. / (2. + v)))) - .95, 0., 1.) * 20.;\n\ + c *= v * b;\n\ + fragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(c, 1), .5);\n\ + }\n\ + "; + } +} + +export default RainEffect; \ No newline at end of file diff --git a/src/components/CesiumMap/mixins/useWeatherParticle/snow.js b/src/components/CesiumMap/mixins/useWeatherParticle/snow.js new file mode 100644 index 0000000..36b9ffc --- /dev/null +++ b/src/components/CesiumMap/mixins/useWeatherParticle/snow.js @@ -0,0 +1,86 @@ +/* + * @Descripttion: 雪花粒子类 + * @Author: 笙痞 + * @Date: 2023-01-04 14:01:07 + * @LastEditors: 笙痞77 + * @LastEditTime: 2023-05-19 09:52:52 + */ + +import * as Cesium from "cesium"; +class SnowEffect { + constructor(viewer, options) { + if (!viewer) throw new Error("no viewer object!"); + options = options || {}; + this.snowSize = Cesium.defaultValue(options.snowSize, 0.02); // ❄️大小,最好小于0.02 + this.snowSpeed = Cesium.defaultValue(options.snowSpeed, 60.0); // 速度 + this.viewer = viewer; + this.init(); + } + + init() { + this.snowStage = new Cesium.PostProcessStage({ + name: "czm_snow", + fragmentShader: this.snow(), + uniforms: { + snowSize: () => { + return this.snowSize; + }, + snowSpeed: () => { + return this.snowSpeed; + }, + }, + }); + this.viewer.scene.postProcessStages.add(this.snowStage); + } + + destroy() { + if (!this.viewer || !this.snowStage) return; + this.viewer.scene.postProcessStages.remove(this.snowStage); + const isDestroyed = this.snowStage.isDestroyed(); + // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错 + if (!isDestroyed) { + this.snowStage.destroy(); + } + delete this.snowSize; + delete this.snowSpeed; + } + show(visible) { + this.snowStage.enabled = visible; + } + + snow() { + return "uniform sampler2D colorTexture;\n\ + in vec2 v_textureCoordinates;\n\ + uniform float snowSpeed;\n\ + uniform float snowSize;\n\ + float snow(vec2 uv,float scale)\n\ + {\n\ + float time=czm_frameNumber/snowSpeed;\n\ + float w=smoothstep(1.,0.,-uv.y*(scale/10.));if(w<.1)return 0.;\n\ + uv+=time/scale;uv.y+=time*2./scale;uv.x+=sin(uv.y+time*.5)/scale;\n\ + uv*=scale;vec2 s=floor(uv),f=fract(uv),p;float k=3.,d;\n\ + p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;d=length(p);k=min(d,k);\n\ + k=smoothstep(0.,k,sin(f.x+f.y)*snowSize);\n\ + return k*w;\n\ + }\n\ + out vec4 fragColor;\n\ + void main(void){\n\ + vec2 resolution=czm_viewport.zw;\n\ + vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\ + vec3 finalColor=vec3(0);\n\ + //float c=smoothstep(1.,0.3,clamp(uv.y*.3+.8,0.,.75));\n\ + float c=0.;\n\ + c+=snow(uv,30.)*.0;\n\ + c+=snow(uv,20.)*.0;\n\ + c+=snow(uv,15.)*.0;\n\ + c+=snow(uv,10.);\n\ + c+=snow(uv,8.);\n\ + c+=snow(uv,6.);\n\ + c+=snow(uv,5.);\n\ + finalColor=(vec3(c));\n\ + fragColor=mix(texture(colorTexture,v_textureCoordinates),vec4(finalColor,1),.5);\n\ + }\n\ + "; + } +} +export default SnowEffect; \ No newline at end of file diff --git a/src/views/systemTemplate/forestFire/Toolbar/Toolbar.vue b/src/views/systemTemplate/forestFire/Toolbar/Toolbar.vue index f0d3433..019c695 100644 --- a/src/views/systemTemplate/forestFire/Toolbar/Toolbar.vue +++ b/src/views/systemTemplate/forestFire/Toolbar/Toolbar.vue @@ -46,6 +46,7 @@ import * as Cesium from 'cesium'; import { useDrawTool } from '@/components/CesiumMap/mixins/useDrawTool'; import { useEventBus } from '@/components/CesiumMap/mixins/useEventBus'; import { useMeasureTool } from '@/components/CesiumMap/mixins/useMeasureTool'; +import { useWeatherParticle } from '@/components/CesiumMap/mixins/useWeatherParticle'; import { drawLocation, drawPolyline, @@ -100,6 +101,11 @@ import toolbarWarehouseIcon from '@/assets/icons/toolbar_warehouse.png'; import toolbarWatersourceIcon from '@/assets/icons/toolbar_watersource.png'; import toolbarRoadIcon from '@/assets/icons/toolbar_road.png'; import toolbarKeyareaIcon from '@/assets/icons/toolbar_keyarea.png'; +// 气象效果图标 +import toolbarSunnyIcon from '@/assets/icons/toolbar_sunny.png'; +import toolbarRainIcon from '@/assets/icons/toolbar_rain.png'; +import toolbarSnowIcon from '@/assets/icons/toolbar_snow.png'; +import toolbarFogIcon from '@/assets/icons/toolbar_fog.png'; const props = defineProps({ viewer: { @@ -111,6 +117,7 @@ const props = defineProps({ let viewer = null let drawTool = null let measureTool = null +let weatherParticle = null let bus = null let toolbarLayer = null let primitiveList = [] @@ -242,6 +249,32 @@ const options = ref([ id: 3, icon: weatherIcon, label: '气象效果', + subtools: [ + { + id: 31, + name: 'sunny', + label: '晴天', + icon: toolbarSunnyIcon + }, + { + id: 32, + name: 'rain', + label: '下雨', + icon: toolbarRainIcon + }, + { + id: 33, + name: 'snow', + label: '下雪', + icon: toolbarSnowIcon + }, + { + id: 34, + name: 'fog', + label: '起雾', + icon: toolbarFogIcon + }, + ] }, { id: 4, @@ -288,7 +321,7 @@ watch(() => props.viewer, (v) => { drawTool = useDrawTool(viewer); measureTool = useMeasureTool(viewer); - // 绑定事件 + // 绘制、测量事件参数 params = { drawTool, measureTool, @@ -296,6 +329,11 @@ watch(() => props.viewer, (v) => { toolbarLayer, primitiveList, } + + // 气象效果 + weatherParticle = useWeatherParticle(viewer); + + // 绑定事件 bus = useEventBus(viewer); // 基础绘制部分 bus.on('toolbar_location', drawLocation); @@ -320,6 +358,11 @@ watch(() => props.viewer, (v) => { bus.on('toolbar_warehouse', drawWarehouse); bus.on('toolbar_road', drawRoad); bus.on('toolbar_keyarea', drawKeyarea); + // 气象效果部分 + bus.on('toolbar_sunny', () => weatherParticle && weatherParticle.destroy()) + bus.on('toolbar_rain', () => weatherParticle && weatherParticle.rain()) + bus.on('toolbar_snow', () => weatherParticle && weatherParticle.snow()) + bus.on('toolbar_fog', () => weatherParticle && weatherParticle.fog()) // 清空 bus.on('toolbar_clear', toolbarClear); }