From 70f3dac8d0bc3ae680602b159f04a6875d289f9e Mon Sep 17 00:00:00 2001 From: qzc Date: Sat, 7 Feb 2026 15:27:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A6=96=E9=A1=B5=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/icons/DiQiu.png | Bin 1703 -> 0 bytes public/assets/icons/ZhongXin.png | Bin 1592 -> 0 bytes public/assets/icons/bg.png | Bin 0 -> 491 bytes public/assets/icons/center.png | Bin 0 -> 708 bytes public/assets/icons/changyong.png | Bin 757 -> 0 bytes public/assets/icons/download.png | Bin 0 -> 430 bytes public/assets/icons/fangda.png | Bin 0 -> 925 bytes public/assets/icons/quanping.png | Bin 0 -> 627 bytes public/assets/icons/quanping2.png | Bin 0 -> 621 bytes public/assets/icons/search.png | Bin 0 -> 635 bytes public/assets/icons/shouqi.png | Bin 0 -> 493 bytes public/assets/icons/shouqi2.png | Bin 891 -> 0 bytes public/assets/icons/suoxiao.png | Bin 0 -> 888 bytes public/assets/icons/tianqi.png | Bin 0 -> 916 bytes public/assets/icons/tuceng.png | Bin 3605 -> 1160 bytes public/assets/icons/zhankai.png | Bin 0 -> 508 bytes public/assets/icons/zhankai2.png | Bin 855 -> 0 bytes src/models/runtime/index.ts | 9 +- src/utils/tools.js | 41 ++++++- src/views/Home/MapCtrl/M2D/Map2D.js | 2 +- src/views/Home/MapCtrl/M3D/Map3D.js | 108 ++++++++++++------ src/views/Home/MapCtrl/M3D/layermgr3d.js | 2 +- .../Home/MapCtrl/M3D/layers/FeatureLayer3D.js | 2 +- src/views/Home/MapCtrl/M3D/utils/cesutil.js | 72 ++++++++---- .../components/Business/SiQuan/index.less | 2 +- src/views/Home/index.js | 10 ++ src/views/Home/mapToolBox/index.js | 60 +++++++--- src/views/Home/mapToolBox/index.less | 6 +- 28 files changed, 236 insertions(+), 78 deletions(-) delete mode 100644 public/assets/icons/DiQiu.png delete mode 100644 public/assets/icons/ZhongXin.png create mode 100644 public/assets/icons/bg.png create mode 100644 public/assets/icons/center.png delete mode 100644 public/assets/icons/changyong.png create mode 100644 public/assets/icons/download.png create mode 100644 public/assets/icons/fangda.png create mode 100644 public/assets/icons/quanping.png create mode 100644 public/assets/icons/quanping2.png create mode 100644 public/assets/icons/search.png create mode 100644 public/assets/icons/shouqi.png delete mode 100644 public/assets/icons/shouqi2.png create mode 100644 public/assets/icons/suoxiao.png create mode 100644 public/assets/icons/tianqi.png create mode 100644 public/assets/icons/zhankai.png delete mode 100644 public/assets/icons/zhankai2.png diff --git a/public/assets/icons/DiQiu.png b/public/assets/icons/DiQiu.png deleted file mode 100644 index 92f1c9eb520dee9d45c50bb820da2db1ebf07940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703 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 literal 0 HcmV?d00001 diff --git a/public/assets/icons/center.png b/public/assets/icons/center.png new file mode 100644 index 0000000000000000000000000000000000000000..a7087d065a3580336076325f9ae27a293daf8076 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5f!3-oTPhGkJq!^2X+?^QKos)S9CkOb1xB}__GzPO=c^3e!Q78%W3ufRDkWkPtuyF7Qh)BpNsAy>KpFV&2 z`tAFVpTBOFPT?$MIZi=dD?i^es5_0 zQ%{rA6U1`P#s6Fxto--HtgpKDw-x@J{_noyZ2q3uPrv*N-wE3$Y9%b-yA=qGUItHB KKbLh*2~7ZJ&uirX literal 0 HcmV?d00001 diff --git a/public/assets/icons/changyong.png b/public/assets/icons/changyong.png deleted file mode 100644 index fc932fa98d00cc57ef1d9848657934da3fe0351a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q%)r3-BL4R-AcwIy$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBesX|Mh%1nGnE&6Q|G(GN{~rDS-6sEc?f>sN3B-1v_}>jEG7-vlhp>U% ziT~XvfnD7$a}>!02|X5ye@wcYRj#|DdMY{||mxh5=LHHGa1W7fOm)%r`8N1Eg>$$0Zo z#{DIyM7_38`~Fu!hE+SRFdf@^&D(!L&QUob)4GhW<-Uu8DwCImt-QFa?xpNZn;$PG zPpahQPp(r{o6P^|*p0(Iv$oxLvoVSkZ#Z-$X0L0D_slHbFYCnBoNI#KTvJq9mR<0ku;Ga4%O4!eE^x27W@Bw;n|p~zGWU(!nTQgF>V1!8HmwvA%YATUcIxI# z>zv1yvo-&Tr|r%C#Qr+wdcXO@{Z2bpx`dsG@k!jiz5nDXk*dmO=XBAN7n9a3<_zC@ zVdlz*w>~GfpPN_F@ASf8I?oQR+8c`c{Vg{mW6x^kIzAUNIA^zO(yg#-&knHibozf% z>?l&qn$c)Ff4RX4uIsaedCa2?Snnv6Hhf&ho!;(sw&vM6;bcwDUAF2Au0@N8AN{HB zbAMyU*7e6kXr!c`*8JHdzJYD@< J);T3K0Ra45WA*?5 diff --git a/public/assets/icons/download.png b/public/assets/icons/download.png new file mode 100644 index 0000000000000000000000000000000000000000..30ad75dd76d0a03d46e21c13f6d3104eeb7c93f3 GIT binary patch literal 430 zcmV;f0a5;mP)Px$Xh}ptR9HvtmcL2^K@f+(-#hpSVq+s{XJbmibYf*8T3B0Kn1G#NVI_hhSoi|= z<^i(jKe zDL~HyxZE8{gSrqcKwE*r3YghOD5_XwW>zS|$bTql7>jfwfDgP4EC&u_Dz5+#0=iJQ zz?r1i-?(`IPrzzKn*zXv>`QWBnT-MXvOW6mePA@(4O`$AmTT!iQl~ONNE`RBtOenD zGjo^ve*is6t__))*&=WOY?iFt8%YN#Di8xK0G}21{j;RC6aaq|>#MK}+!a8)06XER zdB1cTFtbD8astG};CMBhcbXApbKmzgm?q);|HzLFIft>7ND)b YH<|_jFm_fBsQ>@~07*qoM6N<$f>ukgO8@`> literal 0 HcmV?d00001 diff --git a/public/assets/icons/fangda.png b/public/assets/icons/fangda.png new file mode 100644 index 0000000000000000000000000000000000000000..c1323b458a4e41f9a0e1f3b15bba30cfad509e31 GIT binary patch literal 925 zcmV;O17iG%P)Px&S4l)cR9HvFms^OIWe~@I|G+LID~ZGlODM<+$wl-+FfFB^2&$!SBB=}$LGge` zP&806?ZV0qYzszof`|gU=&&~i5gM4s&{PVGj&!)`>fbxd^DWPQ`<@nMci_AD-gjo6 z|1&fHnR&%Hi^lnUMh(FBmB3`+2H>Kk3zu?5b6< zY6M_=H?V3HPT!N%+g868fbFkYm# z0O-p3aY?teIXKs`{T#3%J?k%+vbYt1RPCQ8<%_^QMM0hDHnx2;5XJebq>n37@&WK* zdbdo{OJ#b)B4GP<;K`)8RnnFU=WhXz0p}&%SfLYi{Q|f;Xe#NBHUN$R(+k@D1Kc7h zs=ch>!tuO#p#o)9cx}h6m!|iV%lr))rw;dDQXY_WSB>Mg03HI~Pk!z%OIHqHDsV0- zKVQ&obyr~pGbUxv1|v{JVjz1KX&d@)dm`{hT}pERbE1`&DVI>IDmWJk-p54-#rCy8 z^pKE`Bt6h=m;<=A;QsLn08aqBx*|{pVp!qYz8yH46#FD~3Vg^m2XGY-gC!*B^~`0c zfuLc~F=VBr7b+u=LiPhN1vp$3OwVNiuoqa7{M;?+vnBv}3+|D0xD15twk-H28{gMU z`lSiLQ^0FYX|TNz*aLiB)n;uk1NJ3f`-*w6yzDY%vmjb=EFd9|OFB@MikcM7FP4{2 zfC+_<@6#|l-4;Ml<-<&Qy`&v&LD-I75vlC-iFJ~8R@qmL;~2%^q$BUdbdwafsTAAK z0^5LVGNnf)g?*{i_3^bpj{HyH^VC{{+dl$V0MU42YwBJ`@&hXulctqy5wIq!i8h&t zT)zzb47{BgES0psmIXCM6-(*UF(DfeM7P{8X>g|4jzy#|vsoo6*fS)JTXC*zdoFNq z`X-2PgY&=<;AH$H{n`yM)y0e1^G%XsV;YoE0caEdG9B9y!PuZW61&ECV+J6lVCkOb1xB}__GzPO=c^3e!Q78%W3ufRDkWkPtuyF7Qh)BpNsAy>KpFV&2 z`tAFVpTB*?YcV&Q*v^2??s1D=+{ ziYqD}tmD$Uwda5EJC!BkKbWlRJudeAh;% zf5K;J&e~9(c|Q&8_dAzQ^G*Dv{W&7SO7zp=ixP(>Ha`{qYO&vvqzmv_9_^?bWm1pa@ z=PT>j?b4r!-z%OO!2LfqHLhlxYUvvr;eY#umq~BwU&X7Zt(CN@Mkni2d`PL7L+kuS zr{-Nq^fozWW;#E!ZJpuuP1=*K@-Hl@Of&TRS8`=%Ur)(Di+10f*kdWeE!TF2EuJ#b z^Uu{aTxL9~qTOxtiWD9iW!oVT~V zJ575J_Fhrb?lcV)Oq?+{u2@&IBmLODlw7M@oBntDOfgGN=e|7YqF(5R@I|w3mdKI;Vst0KTt3jsO4v literal 0 HcmV?d00001 diff --git a/public/assets/icons/quanping2.png b/public/assets/icons/quanping2.png new file mode 100644 index 0000000000000000000000000000000000000000..2d474d482785137f02e3c3bc1aa6c5b0ef5cec01 GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^%0R5f!3-oTPhGkJq!^2X+?^QKos)S9CkOb1xB}__GzPO=c^3e!Q78%W3ufRDkWkPtuyF7Qh)BpNsAy>KpFV&2 z`tAFVpTB3TU4J+U7?k+gwHzD?EGfFsl5N(-z^Ee_eb|^ zE4ysdqNkHHegq%$IL@Cbl_uN7{`u^z@H=@6e@cmG%xrcOlPa;gy_h4XxcDsVq_y8V zPVs+^wF*AlxpV!J#Z%_W<}O;vF89r-Cr8oAZ_l!(CD%?)T$R3VuN#xzQWu8`cE_~v#vi+aHo1;JWiDW;wp?`mh4+hqgIg2QW@l_NZJcp-j>**(uh)D! z>iKJ?nA9z|$-Qe0uD|&FV_Ep~CGwZ=OmaKdsQlLH+v8Y0vyD}CFMnD7FZh@?M`gwf Z{;R2GiAQhq*a72#!PC{xWt~$(69DSsN6!EN literal 0 HcmV?d00001 diff --git a/public/assets/icons/search.png b/public/assets/icons/search.png new file mode 100644 index 0000000000000000000000000000000000000000..88e65a45a9ef3ac73974050c30e0a4cbe0b60195 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^NCkOb1xB}__GzPO=c^3e!Q78%W3ufRDkWkPtuyF7Qh)BpNsAy>KpFV&2 z`tAFVpTBgnPbV&UIA`TDFT1A$iI zoErimOV%*G|3BrNrKFS4_u}vSXH7FY%OZ1XSMKdq5v%8I+Q)y{r#>jzBdqsT*_WMG zHm~JNbz`n9&G{=G`#UIe*Xqe@=KL(Z>9G0utXCyVC*SCsc4<}KnRUybE?8yAdL?na z)JFar$F8pVG*iRr!P(Ej;u>4E=IM4B#D5m~X&S#X;8BWWA@fHc!$XfUoCV+acpGu= zIA;0I&LUC0FOz$vprXblr#1n#F0H9smMXO9x-(CnrfIiCbm1b+gGw#72g>ca*duyn zmw2@_Ze!V|*F5F-1C}MXECnB5u{M0tuy~dh`w3I!17GJ)ojlJ;?()$c2Y&?|EvTug zJ5$`0yU*p={Bpa!dh25(1;4a<`d;q6tjp+rrg4ezxB1QLHm^6W3CPo0tyA+y6q?W-NbQu{A7hL4VrXh;4D3rsf-7RGWAF&oN%h^8c5gZJ@(8BD~wAj_B8VXV}-%f)z4*}Q$iB}m7Gch literal 0 HcmV?d00001 diff --git a/public/assets/icons/shouqi.png b/public/assets/icons/shouqi.png new file mode 100644 index 0000000000000000000000000000000000000000..2f097361e30db2c0282ddaa798f1824e1201fe25 GIT binary patch literal 493 zcmVPx$r%6OXR9Hu~*WW7yQ53-O@A*$WDCO0E;Z+f3qhv*iQk1g0r6@&;h$705^57rw z>P30w&p6y|R(ICU%(-*8FIzkJ&iUM#x%b>7syYOW1D_)DOhQxDBj7_s4ibjtx{9h^ z19REGZ4v2MZlL~CUjjM%_a069sfB&>wKmnp7BH?2#ZK~P?&aH?- zfD^F{oLUg204HJ@ zfC9vbh`bq==nfEP+vZ;ZhDGGP2B47)7?3%w8W2>$2(@(vD~`O z{l{|0%>9Lls;&W{$m})i%*TM2I*&c~3i^suQ}8S$$2DcGy0E(pv+{f*E3+S}Qfho% jRTsNA5xGbi7x(=FM-M&iqQ58U00000NkvXXu0mjf*c{rB literal 0 HcmV?d00001 diff --git a/public/assets/icons/shouqi2.png b/public/assets/icons/shouqi2.png deleted file mode 100644 index 9c9e7aaf7d03aca277e73444c3b62d4d9e32f3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmeAS@N?(olHy`uVBq!ia0vp^`XJ1~%)r2C{4baT$YCrFa(7}_cTVOdki(Mh=Y!Mc(0J~MIqt4Lc%A7gpXi0kntJJ0E&N7Ncyah^i3h@ zi$c;@D4F<0A@QpMf&_9wNImU~UiMehg0D8EU!AMIdDVXlZ21<^`8~exd)nmhxify0 z%=uBh@JG|KpA$Cxn!D@QlKsC|ANjrW?4JXd{v5yl=iHsYS0Dbp^X%{A*Z*F9`1kSa zzaPK;1HqXu>TE!_N|glp1v796NGNDncmzZw6jU^{_s?Ixe*f|F_n*K2{=2&II#3m7 zfk$L91B19A2s55i`)tp^z+~p>;uvD#KR2{H?6v`q=v}sCo)=uH&NfmDSPorEOZ5Kx zzrHQ5EN8jHvD|*$SkG-bH+30=mKiC1o4mOHdYYAQ3QJDC`PLm4-%40!z1o%Od_a9J z>!GctK|Pvsi>{<(?tQe-Q}Y}{pYM_L8yWXc2)g)P?xUypiw#((ET&d9wx=W@b|hmG5}tl99mZtuq9>o_I%1^JdeU&b=$ ztuXHg-BoiF>JDtt)MTieHRaKtty89yPq#U7o$V>NnZ)~dGd7mqSg_~P!xJe2_g?H1 zVV!=z^49z8+>1YzJ~;0=oBiio>6GWpMod73)0vHI{5g%*tE)?#ujGEuyG>u-z0%0w z^84=aj=JkD{vYoD>EqN?D^YCgZ;um6&i_64M4{ewu5Z4w&F>l5)%p$_e%bz~=wxq_ z&NXf+{V?xP!Tg$sb*`lmCF?@x$!lB^ek!j1>RH&*HF>SBD*v9m)mKzpz1hv>-^%aP z_7xmC_51m~&iX*juoBm+_jexKQSj-+|6@5kcJuqwFRb65G~v8;$KU+wn8{VCM#?dF zPW<0!=<;*B+sX5C$usz`KDqhle;Xg$lYc=6_x;<~%(!y@RqJ>8VuHWh-!1vB-r4bI z`uTm+`}=+eTl_jKBJ#Tbdi|Yfo(5;(V~Jb^DUT%nJYe5%Y?frkSizY4`*-Pz@;EzS PvSRRb^>bP0l+XkK$WX8r diff --git a/public/assets/icons/suoxiao.png b/public/assets/icons/suoxiao.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6cd0cfc3dd37650a689e32a51d1b1b30d19033 GIT binary patch literal 888 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 aF!Vp^L!!YLW<)Lk0000!e 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 diff --git a/public/assets/icons/zhankai.png b/public/assets/icons/zhankai.png new file mode 100644 index 0000000000000000000000000000000000000000..e25c4971985b286bf816dab7a1f760ffde32b0e2 GIT binary patch literal 508 zcmVPx$wn;=mR9HvFmr*MOQ51mB_cM4^UcCAv9ux_!BBDeoO6^jLBBh8@HcC-m{R^*3 zdG|Apz1yy4*O|FzW@mQiapvCheRJ-;XU-r4T&lVlrUOrT!l>$uh>VHIJ9#E1$Exb9 zh|G5G)qtiama5iU;~Jf@%|Zfw@DOVX_>2kk!Nc%cZUF;62fP%39|4VA0tS2mcrFTW z@1NM@?sEgas~!+ zPtH$W0t3DY+>{AV&42;l2CmA6n*s)W7r3kf{!hSw?*Zpk!FvP@_&#t}CHzmofFA-U zRm0l?s=C(tG$xN$9XNKtCq?ATbJVh81%dEQe@qPW3QUN|_rL-nz(|)M<70CGoH~}m zUG=P3J(X~z$1o!k!z)A?62mLS84_E-b=i9&vmr6|#0GF%rbM(O8lWL@osOtLN}cew zWKjv1K#IgNkgTBQ%BX6lgj*m*!rPXoO5_qqk?{VQm=d`KQY5BJ-r;val;c8er y^OBh;_H&vjR-s+{0WM;1pM0*W^CB`XB5%LPBRgzE%E5gA0000J!OXzGc(CrV8<4|T9OUlAu%JkA?ce! z(ierKuTV1ai$da81q2D?f{=RJ7rpGSrUhSZO20Z+ee%evpoX?leDLcV~B-+@6_(H%LW22(}TR^9h?a`LPH`+MhJJuyvW z_m6qW)#YVhwmj;vNKGq${^en8Gy7(@;-6xhgm-^84bRj~6OB6dCbvTBf(=vY;K0_4pyKf;bmDBaIoIdlF|9E~-|Y9zWAnEPTSuCmj8; zC*N+c_4_Ju`Kzl|_8RUlzZh?e+>jI6o0pte&GFm!?#2a0>)M%~xZJ<{`fa57eW{lV zm)jj!{fq7W`~JB86W?}}KE5@RPt&FQZ#yr&y}H7_lzE%P zM}2Pd4PwgwlFcuOCI91l^ZoBUPKgix&d+$3ZJc22cG=>({k%`_Q|CzkwimLT{r7)( fjq!c~!Jq66ihu0CF+5NOrX2=PS3j3^P6()({ markers: {}, viewTick: 1, //用来刷新页面更新Marker位置 showPanels: true, //是否展开面板 - homeCheckedObj: {}, //首页展开面板对象 + isFullScreen: false, //是否全屏 + homeCheckedObj: {}, //首页展开面板对象大屏不用 featurePops: [], // [{ id, type, data, lgtd, lttd, elev }] layerSetting: {}, @@ -81,6 +82,12 @@ export const runtime = createModel()({ showPanels: val, } }, + setIsFullScreen(state, val) { + return { + ...state, + isFullScreen: val, + } + }, setHomeCheckedObj(state, val) { return { ...state, diff --git a/src/utils/tools.js b/src/utils/tools.js index cced45b..66f88bd 100644 --- a/src/utils/tools.js +++ b/src/utils/tools.js @@ -626,4 +626,43 @@ export const download = (url) => { // 模拟点击事件,开始下载 downloadLink.click(); - } \ No newline at end of file + } + +export const showFullScreen = (show=false) => { + //当前是否全屏 + const checkFullScreen = () => { + return !!( + document.fullscreenElement || + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement + ); + }; + + if(show && !checkFullScreen()){ + // 进入全屏 + const elem = document?.documentElement; + if (elem?.requestFullscreen) { + elem?.requestFullscreen(); + } else if (elem?.mozRequestFullScreen) { /* Firefox */ + elem?.mozRequestFullScreen(); + } else if (elem?.webkitRequestFullscreen) { /* Chrome, Safari & Opera */ + elem?.webkitRequestFullscreen(); + } else if (elem?.msRequestFullscreen) { /* IE/Edge */ + elem?.msRequestFullscreen(); + } + } + + if(!show && checkFullScreen()){ + // 退出全屏 + if (document?.exitFullscreen) { + document?.exitFullscreen(); + } else if (document?.mozCancelFullScreen) { /* Firefox */ + document?.mozCancelFullScreen(); + } else if (document?.webkitExitFullscreen) { /* Chrome, Safari & Opera */ + document?.webkitExitFullscreen(); + } else if (document?.msExitFullscreen) { /* IE/Edge */ + document?.msExitFullscreen(); + } + } +} \ No newline at end of file diff --git a/src/views/Home/MapCtrl/M2D/Map2D.js b/src/views/Home/MapCtrl/M2D/Map2D.js index 88d0f6f..84f9927 100644 --- a/src/views/Home/MapCtrl/M2D/Map2D.js +++ b/src/views/Home/MapCtrl/M2D/Map2D.js @@ -82,7 +82,7 @@ export default class Map2D extends BaseMap { this.dispatch.runtime.setMapCenter({ center: this.PROJ2GG(center), zoom: zoom, - pitch: config.homePitch, + pitch: config.pitch3d, }) } }); diff --git a/src/views/Home/MapCtrl/M3D/Map3D.js b/src/views/Home/MapCtrl/M3D/Map3D.js index 3ff0f18..d8d0087 100644 --- a/src/views/Home/MapCtrl/M3D/Map3D.js +++ b/src/views/Home/MapCtrl/M3D/Map3D.js @@ -9,13 +9,13 @@ import { BouaLayer3D } from "./layers/BouaLayer3D"; import { BouaMaskLayer3D } from "./layers/BouaMaskLayer3D"; import { VillagesBouaLayer3D } from "./layers/VillagesBouaLayer3D" -import { getCameraViewPosition, getCameraViewCenter } from './utils/cesutil' +import { getCameraViewPosition, getCameraViewCenter, getNewPosition } from './utils/cesutil' const { Cesium } = window; function __prepare_ces(dispatch) { - Cesium.CesiumWidget.prototype.showErrorPanel = function (title) { + Cesium.CesiumWidget.prototype.showErrorPanel = function (title, error) { dispatch && dispatch.map.setMode('2d'); if (title && title.indexOf('constructing') >= 0) { alert('无法初始化三维场景,如果一直出现此问题,请尝试下载最新的chrome浏览器'); @@ -104,31 +104,38 @@ export default class Map3D extends BaseMap { Cesium.CameraEventType.MIDDLE_DRAG, Cesium.CameraEventType.WHEEL, Cesium.CameraEventType.PINCH ]; - let isInitialMove = true; - //监听地图移动完成事件 - viewer.camera.moveEnd.addEventListener(() => { - if (isInitialMove) { - isInitialMove = false; - return; - } - //获取当前相机高度 - const { lon, lat, height:olZoom } = getCameraViewCenter(viewer); - console.log(lon, lat, olZoom); - if(lon && lat && olZoom){ - this.dispatch.runtime.setMapCenter({ - center: [lon, lat], - zoom: olZoom, - pitch: config.homePitch, - }) - } - }); - this.layerMgr = new LayerMgr3D(viewer); this.getLayer3D(viewer)//加载地图 + let lastPosition = {x:null,y:null,z:null};//记录上次移动坐标 + let moveStartTime = Date.now();//记录上次setMapCenter事件, 用于防抖 + let flag = false //帧检测移动后改为true + const timeInterval = 500; //防抖时间 viewer.scene.postRender.addEventListener(() => { this.dispatch.runtime.tickViewChanged(); // this.layerMgr.frameUpdate(); + + const currentPos = viewer.camera.position + const { x, y, z } = lastPosition + if(currentPos.x===x && currentPos.y===y && currentPos.z===z){ + if(flag && (Date.now() - moveStartTime >= timeInterval)){ + const { lon, lat, height:olZoom } = getCameraViewCenter(viewer)||{}; + console.log(lon, lat, olZoom); + if(lon && lat && olZoom){ + this.dispatch.runtime.setMapCenter({ + center: [lon, lat], + zoom: olZoom, + pitch: config.pitch3d, + }) + } + flag = false + moveStartTime = Date.now() + } + }else{ + //在移动 + lastPosition = { x: currentPos.x, y: currentPos.y, z: currentPos.z }; + flag = true + } }); let destination = Cesium.Cartesian3.fromDegrees(115.064,30.989,5000) //默认相机位置 @@ -188,21 +195,38 @@ export default class Map3D extends BaseMap { return this.layerMgr.getLayer(name); } - zoomTo(cameraTarget) { + zoomTo(cameraTarget={}) { if (cameraTarget.center) { - this._map.camera.flyTo({ - destination: getCameraViewPosition(cameraTarget), - orientation: { - heading: Cesium.Math.toRadians(0), - pitch: Cesium.Math.toRadians(config.pitch3d), - roll: 0.0, - }, - duration: 1.5, // 飞行时间,单位秒,可以根据需要调整 - // 其他可选参数,例如: - // maximumHeight: 10000, // 最大高度 - // pitchAdjustHeight : 1000, // 在飞行过程中调整俯仰角的高度阈值 - // flyOverLongitude: 100, // 飞越经度,用于控制飞行路径 - }); + if(cameraTarget.fixed){//固定相机朝向 + const camera = this._map.camera; + const destination = getNewPosition(cameraTarget.center, cameraTarget.zoom, camera) + if(!destination){ + return + } + camera.flyTo({ + destination: destination, + orientation: { + heading: camera.heading, + pitch: camera.pitch, + roll: 0.0, + }, + duration: 1, + }); + }else{ + this._map.camera.flyTo({ + destination: getCameraViewPosition(cameraTarget), + orientation: { + heading: Cesium.Math.toRadians(0), + pitch: Cesium.Math.toRadians(config.pitch3d), + roll: 0.0, + }, + duration: 1.5, // 飞行时间,单位秒,可以根据需要调整 + // 其他可选参数,例如: + // maximumHeight: 10000, // 最大高度 + // pitchAdjustHeight : 1000, // 在飞行过程中调整俯仰角的高度阈值 + // flyOverLongitude: 100, // 飞越经度,用于控制飞行路径 + }); + } } else if (cameraTarget.bound) { const b = cameraTarget.bound; const p1 = Cesium.Cartesian3.fromDegrees(...b[0]); @@ -221,3 +245,17 @@ export default class Map3D extends BaseMap { BouaMaskLayer3D(viewer)//县界外遮罩层 } } + +// // 这是一个测试性能的工具留着 +// let listenerExecutionTimes = []; // 记录每次执行的时间 +// const start = performance.now(); +// const end = performance.now(); +// listenerExecutionTimes.push(end - start); + +// setInterval(() => { +// if (listenerExecutionTimes.length > 0) { +// const avg = listenerExecutionTimes.reduce((a, b) => a + b, 0) / listenerExecutionTimes.length; +// console.log(`平均每帧监听函数执行时间: ${avg.toFixed(3)}ms`); +// listenerExecutionTimes = []; // 清空 +// } +// }, 1000); \ No newline at end of file diff --git a/src/views/Home/MapCtrl/M3D/layermgr3d.js b/src/views/Home/MapCtrl/M3D/layermgr3d.js index c246ce0..fc6f4f1 100644 --- a/src/views/Home/MapCtrl/M3D/layermgr3d.js +++ b/src/views/Home/MapCtrl/M3D/layermgr3d.js @@ -48,7 +48,7 @@ export default class LayerMgr3D extends LayerMgr { */ addAppLayers(dispatch, visible, setting, otherParams) { visible = visible || {}; - // dispatch.map.setMap(this.viewer); + dispatch.map.setMap(this.viewer); //河流 this.addLayer(new HLLayer3D({ visible: visible[HLLayer3D.LayerName], setting, dispatch })); //湖泊 diff --git a/src/views/Home/MapCtrl/M3D/layers/FeatureLayer3D.js b/src/views/Home/MapCtrl/M3D/layers/FeatureLayer3D.js index 39f41f3..e4c3f6e 100644 --- a/src/views/Home/MapCtrl/M3D/layers/FeatureLayer3D.js +++ b/src/views/Home/MapCtrl/M3D/layers/FeatureLayer3D.js @@ -75,7 +75,7 @@ export default class FeatureLayer3D extends BaseLayer3D { */ setData(records) { const viewer = this._viewer; - if (!viewer || !viewer.dataSourceDisplay?.defaultDataSource) { + if (!viewer || !viewer?.dataSourceDisplay?.defaultDataSource) { console.log('viewer null'); return; } diff --git a/src/views/Home/MapCtrl/M3D/utils/cesutil.js b/src/views/Home/MapCtrl/M3D/utils/cesutil.js index 59ce822..3c5b804 100644 --- a/src/views/Home/MapCtrl/M3D/utils/cesutil.js +++ b/src/views/Home/MapCtrl/M3D/utils/cesutil.js @@ -97,42 +97,43 @@ export function getCameraViewPosition(mapCenter) { } //获取摄像机焦点经纬度和高度 -export function getCameraViewCenter(viewer) { +export function getCameraViewCenter(viewer={}) { // 1. 获取屏幕中心点的射线(从相机到屏幕中心) - const ray = viewer.camera.getPickRay(new Cesium.Cartesian2( - viewer.canvas.clientWidth / 2, - viewer.canvas.clientHeight / 2 + const ray = viewer?.camera.getPickRay(new Cesium.Cartesian2( + viewer?.canvas.clientWidth / 2, + viewer?.canvas.clientHeight / 2 )); // 2. 计算射线与地球表面的交点 - const intersection = viewer.scene.globe.pick(ray, viewer.scene); + const intersection = viewer?.scene.globe.pick(ray, viewer?.scene); if (intersection) { // 如果有交点(看向地球) const cartographic = Cesium.Cartographic.fromCartesian(intersection); return { lon: Cesium.Math.toDegrees(cartographic.longitude), lat: Cesium.Math.toDegrees(cartographic.latitude), - height: heigjtToZoom(viewer.camera.positionCartographic.height)//cartographic.height + height: heigjtToZoom(viewer?.camera.positionCartographic.height)//cartographic.height }; } else { + console.log('如果看向天空或太空,获取射线与椭球体的交点'); // 如果看向天空或太空,获取射线与椭球体的交点 - const ellipsoid = viewer.scene.globe.ellipsoid; - const intersection2 = viewer.scene.camera.pickEllipsoid( + const ellipsoid = viewer?.scene.globe.ellipsoid; + const intersection2 = viewer?.scene.camera.pickEllipsoid( new Cesium.Cartesian2( - viewer.canvas.clientWidth / 2, - viewer.canvas.clientHeight / 2 + viewer?.canvas.clientWidth / 2, + viewer?.canvas.clientHeight / 2 ), ellipsoid ); - if (intersection2) { - const cartographic = Cesium.Cartographic.fromCartesian(intersection2); - return { - lon: Cesium.Math.toDegrees(cartographic.longitude), - lat: Cesium.Cartographic.toDegrees(cartographic.latitude), - height: 0 - }; - } + // if (intersection2) { + // // const cartographic = Cesium.Cartographic.fromCartesian(intersection2); + // // return { + // // lon: Cesium?.Math?.toDegrees(cartographic.longitude), + // // lat: Cesium?.Cartographic?.toDegrees(cartographic.latitude), + // // height: 0 + // // }; + // } } } @@ -192,5 +193,36 @@ export function zoomToHeight(olZoom) { } //cesium的摄像机height转openlayers的zoom export function heigjtToZoom(height) { - return Math.max(0, Math.min(28, Math.log2(120000000 / (height - 400) ))) -} \ No newline at end of file + return Math.max(0, Math.min(28, Math.log2(120000000 / (height>400?(height - 400):height) ))) +} + +//根据经纬度、当前相机朝向、zoom,返回Cartesian3位置 +export function getNewPosition(center, zoom, camera ) { + //相机坐标的高度 + const height = zoomToHeight(zoom) + //获取摄像机朝向方向的单位向量(长度1) + const direction = Cesium.Cartesian3.normalize( camera.directionWC, new Cesium.Cartesian3()); + const reverseDirection = Cesium.Cartesian3.negate(direction, new Cesium.Cartesian3());//这里要取反用来计算处摄像机所处的位置 + //相机与地表焦点的坐标 + const position = Cesium.Cartesian3.fromDegrees(center[0], center[1], 200); + //相机俯仰角 + const pitch = camera.pitch + if(pitch>=0){ + console.log('请朝向地面'); + return false + } + //直线距离 + const distance = height / Math.sin(-pitch); + // 计算移动后的位置 + const newPosition = new Cesium.Cartesian3(); + Cesium.Cartesian3.add( + position, // 当前位置 + Cesium.Cartesian3.multiplyByScalar( + reverseDirection, // 方向向量 + distance, // 移动距离 + new Cesium.Cartesian3() // 临时向量 + ), + newPosition // 结果位置 + ); + return newPosition +} diff --git a/src/views/Home/components/Business/SiQuan/index.less b/src/views/Home/components/Business/SiQuan/index.less index 7652176..8db0733 100644 --- a/src/views/Home/components/Business/SiQuan/index.less +++ b/src/views/Home/components/Business/SiQuan/index.less @@ -1,6 +1,6 @@ .siquan-view { width: 100%; - height: 100%; + height: 0; position: relative; @import "../common.less"; diff --git a/src/views/Home/index.js b/src/views/Home/index.js index 113672b..6484f6a 100644 --- a/src/views/Home/index.js +++ b/src/views/Home/index.js @@ -1,4 +1,5 @@ import React, { useState, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; import Header from './components/Layouts/Header'; import SiQuan from './components/Business/SiQuan'; import SiZhi from './components/Business/SiZhi'; @@ -7,11 +8,19 @@ import SiGuan from './components/Business/SiGuan'; import MapCtrl from './MapCtrl/index' import MapToolBox from './mapToolBox' import './index.less'; +import { showFullScreen } from '@/utils/tools'; const HomePage = () => { const [activeMenu, setActiveMenu] = useState('siquan'); const [userInfo, setUserInfo] = useState({ userName: '系统管理员' }); const [isReady, setIsReady] = useState(false); + const isFullScreen = useSelector(s => s.runtime.isFullScreen); + const dispatch = useDispatch() + + useEffect(()=>{ + //根据isFullScreen判断当前是否进入全屏 + showFullScreen(isFullScreen) + },[isFullScreen]) useEffect(() => { // 兼容 Hash 路由模式:参数可能跟在 # 后面 (例如 /#/home?token=...) @@ -34,6 +43,7 @@ const HomePage = () => { setUserInfo({ userName: finalUserName }); setIsReady(true); + dispatch.runtime.setHome() }, []); const renderContent = () => { diff --git a/src/views/Home/mapToolBox/index.js b/src/views/Home/mapToolBox/index.js index 914eadc..e9d2f40 100644 --- a/src/views/Home/mapToolBox/index.js +++ b/src/views/Home/mapToolBox/index.js @@ -1,18 +1,25 @@ import React, { useEffect, useReducer, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Checkbox, message } from 'antd'; -import {CloseOutlined} from '@ant-design/icons'; +import { CloseOutlined } from '@ant-design/icons'; import { useLocation } from 'react-router' import './index.less' export default function Btn() { - const showPanels = useSelector((s) => s.runtime.showPanels) - const homeCheckedObj = useSelector((s) => s.runtime.homeCheckedObj) - const layerVisible = useSelector(s => s.map.layerVisible); - const mode = useSelector(s=>s.map.mode) const dispatch = useDispatch() const location = useLocation() - const [open, setOpen] = useState(false) + const showPanels = useSelector((s) => s.runtime.showPanels) + const layerVisible = useSelector(s => s.map.layerVisible); + const isFullScreen = useSelector(s => s.runtime.isFullScreen) + const mapCenter = useSelector(s => s.runtime.mapCenter)||{} + const mode = useSelector(s=>s.map.mode) + const [open, setOpen] = useState(false)//是否弹出图层窗口 + const [targetZoom, setTargetZoom] = useState(null)//点击缩放按钮后地图目标的zoom值 + + useEffect(()=>{ + //移动地图后同步targetZoom值 + setTargetZoom(mapCenter?.zoom||null) + },[mapCenter]) const layerVisibleChanged = (event)=>{ const vo = { [event.target.name]: event.target.checked }; @@ -49,22 +56,45 @@ export default function Btn() { } } - return (
-
{setOpen(!open)}}> - +
dispatch.runtime.setShowPanels(!showPanels)}> + +
+
{}}> +
dispatch.runtime.setHome()}> - +
-
dispatch.runtime.setShowPanels(!showPanels)}> - { - showPanels ? - - : +
{}}> + +
+
{ + if(mapCenter?.zoom === targetZoom){ + dispatch.runtime.setCameraTarget({...mapCenter, zoom: mapCenter.zoom + 1, fixed:true}) + setTargetZoom(mapCenter.zoom + 1) } + }}> + +
+
{ + if(mapCenter?.zoom === targetZoom){ + dispatch.runtime.setCameraTarget({...mapCenter, zoom: mapCenter.zoom - 1, fixed:true }) + setTargetZoom(mapCenter.zoom - 1) + } + }}> + +
+
{}}> + +
+
dispatch.runtime.setIsFullScreen(!isFullScreen)}> + +
+
{setOpen(!open)}}> +
diff --git a/src/views/Home/mapToolBox/index.less b/src/views/Home/mapToolBox/index.less index e17445f..5411159 100644 --- a/src/views/Home/mapToolBox/index.less +++ b/src/views/Home/mapToolBox/index.less @@ -12,8 +12,10 @@ align-items: center; .mapToolBtnIcon{ - width: 30px; - height: 30px; + width: 28px; + height: 28px; + padding: 7px; + background: url(../../../../public//assets/icons/bg.png) 50% 50% / 100% 100% no-repeat; margin-top: 5px; cursor: pointer; }