From 48d26d8479f5f7e14f3f7b28df50e2a775582029 Mon Sep 17 00:00:00 2001 From: yyy <2605810609@qq.com> Date: Sat, 15 Feb 2025 17:15:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/location-icon.png | Bin 0 -> 3345 bytes src/assets/warehouse-map.png | Bin 0 -> 29880 bytes src/store/modules/app.ts | 2 +- .../{realTimeMap => example}/框选demo.vue | 0 .../测距.vue => example/测距demo.vue} | 0 .../mapPage/example/第一版编辑地图.vue | 1413 +++++++++++++++++ .../贝塞尔曲线demo.vue | 0 .../example/转换成实际坐标demo.vue | 151 ++ src/views/mapPage/realTimeMap/editMap.vue | 182 ++- src/views/mapPage/realTimeMap/test.vue | 223 ++- 10 files changed, 1764 insertions(+), 207 deletions(-) create mode 100644 src/assets/location-icon.png create mode 100644 src/assets/warehouse-map.png rename src/views/mapPage/{realTimeMap => example}/框选demo.vue (100%) rename src/views/mapPage/{realTimeMap/测距.vue => example/测距demo.vue} (100%) create mode 100644 src/views/mapPage/example/第一版编辑地图.vue rename src/views/mapPage/{realTimeMap => example}/贝塞尔曲线demo.vue (100%) create mode 100644 src/views/mapPage/example/转换成实际坐标demo.vue diff --git a/src/assets/location-icon.png b/src/assets/location-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d67c623222793ac9458558e1ef1ef847bdbe7e55 GIT binary patch literal 3345 zcmcInc|25a7aw)iSeqflgv*eWC}b(yWiTjPQkD`XS(=1|nAD{Vp`m>+wvi=E$`*!} zDN7-eke#wGS+l>_=l%Wt{_%d^_m6YW=X{>?obUH@&OPUOo=8h`V?J&%ZWIc|XF?=c zBf54=&^wTC-r0NxqB#7ljrCFajeAE?DBjN|1jr`v{A5y-x8oV1TgeXsC)oMgKAr!{JU8{muQze7XVpzeeu)u09Wa%7+`Cb{$?`qVHcYL|VE~8L z0~1j2%j4kJFhpsCx4;PwbU3yT;2Jb4pkwrCbQ$`^yI4Ki;VbhwTpU2QNt&J89*+OV z@@;FL*(Ti$7w3=(cJw31lP8i-e#&gjGS6fc(Q*}fY?BO@`X;|e1XORNJB{g&h8cNq zE??dlsK}(tDa{uyj-12Fh>xzf&35q&_b&Tf>)Vb#YYOR5rWYv{TdCp8GlZPUUqb)kA|+!3YP7_T!|%%d%yz6b(|p>SEx!O2Gs!{;fVuaVhB z;A1ZdbW1g;2rqO}Js^c2S{RvFu+0na##wlNPLHMmm+gP-h2O_1Z-4*{aJ`zd{p?O= zGr@~lNHj+T$mk2#Y)99}0E?3yD~yO~+Z4+YvjeQ|^^9L{L=@XsdZ_YHz0F)7FluqP zs7Kff{~VA%wH1oTrBKbqh&Ddw?MT1EP+r#F)tmR$LBYwI_4824loLaH(?PHocLY!D z@RUddeMrQ6F4<}>`n2i>rxo}5nI)}|(rt27rR=rqW_fKjy~;BztUpw5k090c4y~8G zw8UA7FmsRY0!9N?hnGqbQ;7KmG3$E!j@Y~ZFlq(lgApDsmp9k;bQWWeLK{Al^$m6L zAx(JQn2JMz#3fl-ucZ{0?>Nr17iYCq65NyLnf2!oggEl-O$Q~#?rN=I=b2)x5R_wy zyPxEa5#Bt4{L`VPLv9s&fQwhlaO$=ERK86neB;4mCMSKmdn2Sj{}Of zm(y2sS7bIAe}~I@fxc6Y+WT9a@Iu-Pe+O+HfiU288DG6`WkZ%J2a`AY zk>)wIc=JP-q<^4UkIS9cB6-&Z4!zr47clCtmjxl1zcp(ho6u-I}?0zYw=5HdnQU_ty_mUb>(ENii za79xO^I=Qs`hjK(et2Z~mLU5oKZbqPSK}XtKHx~=c0~4?W7da2>P>zPh<6wT@ybOA z5_C1uY02Bo{|RAo9J&&^Q9vS<&2(Suo z`nt#kQrGt$F)-YQPD3ZBP73N_RyAGjMgbTCR>$C{+%0g?kIgHDcu9xcEwMmB6T?)| z0|I&&!@s=bWE9-qgjKPTxdleeh<5650ENkTw=5zG+TE{GL_tD6O|Q$$6f(ZAJ|DKJ z_=(3&K>*&rZ>X!Z`bqT3v5hZ&)t{XxUrn!s%sN*)e_1rfd~DqUYD&ej1#Pem7$!Q$ z$5oo>$VhWXOTW)(*#p_UoaT>0(6l3rFcy}Ess=RatWPnKpifX#niLiN#MBkAde`Wn zU^tPMiY0^}yyBWHIMkoMK+1a^ciCIJM{=#UIh9m&Br#D#$M=H%_&Ba^taIgdNvcYt z*x*&IF;Mya+8G?*)EQfccMthhwb!Kd?Dqn3&4w5bB}oYAx1mc@d5^>BKq)Hf zvGpki^zdzkGnRm@8vcqN;L4%8p{;@MWk;|wiWXL?0Jh)SBN{x=9vh)(aARDa_S@v|xwdG9x$rd1NB*foK<7%o$Oq8($lfdixJbMXbKr^p3qhd8UU_ zkg<2_i5ivx`F`_D;qWd5Dre0xBA(ML#7ipcQtKmesY(+^=H!yzC-;d7@<&&K}X4WYrr1Nn$BdI60^z62qLGa%;2r!sx z)t}AJxK=Zm!*xf$ZX>Ew%>rZc(LuSe(o4R(FpG(&lDrMc_dqKjVS(sNH2s$=oDG8P zB~xmzdqrMLe$sq-m`z^?g!&wofHBXIm;0~EZ-}%s!vIf}%aW!`5wSLdp9r)vEyLzSu*OI%O{Y!F zJ3k;EmmK0wwr~C&1~yv?WFb?68D)3zWHTBhsy+mAq>)RXi>=)$)oo}2KH1wj$RNmh zdb(|Q3<@R~n4}Q$U{#}~tf#Tnu0EwW+=kD@f?Fn-6;TL(K_hru}AMM*2AD+nrz3+H7-eJZs!(}D{ zhx_1&1xD#{*N%x76ow3;<47SB*-X~TogaI1+R+g2CI8>^&yqTRQMhH}45Yb|VOcJC zkI2yc7Zq*YJKS*}jN@5l{-I^YGy!z{f)!cUcRoJ+J~jC=Hy|GgM#x4=8PjDV27Td~ zRnSeyrwN=oWV`g4+-~Gbsz&eenzi%60+7pO;fPNQ5UE2n*8?CLG_5)P2gAmlcIFG( zA4X8esUwcGeL7i*sxa-s4u&3WEC%%S=H# z(XCVz+`7L*;j}pl8u~I~h2Ms@PA9##(c}Q)RML%OkP61cH(38d=6++e#8K&6;89aG lvq#8rps8}>f4q5f`|U6>Xn+66UF3~}GBGqK1LrFwLbo0q$wHHK0q)6aD z=mt^d!SB2Pp9u6 z4_UfJv>p)=<@u=jHKO;CC=5|HDU6y(_TL4`|MwSdS8vORS{!b%I+l@S_XayL+;e>w zoHF-;WJfIkd?5NFTF_sUF3u7pDRsRC0nt!tJI(5NB6}6D*FMp+am_**%#&i~2HC!< zt8bUSs;wRe>4rcw#5`s$D_>&o@Y_YWeN`?dE&FJ^IiM=rcF)#FuWtX5-gql?L+aBK z`HF?4e+El1Tr+&3j@$(m2+CR#WCcN40tWU8n4bf3xO-yHMIq6V@J)r$=u;M*k52_X zny^`o(=VpFmAbqq=o)VJ?c$@iA15TQ#8DdEC$K!B=H`YvfoU5zj2ET#D-atTn98CP zmnzA>u^BF|W8+ruO3CE0PzY2~SsZ{v_01+(_H*9NQ$e9D!!yeV zzgRe|O>yIqv!B~FHUq>ZgUx`~swf7zbU`tjd%h38u3TfWGdKr}2TGV`u!xb3EEC`===AHJDa2sg)zn)}X|Pl(->Xn{jCD27CzQAE)4Al()` zTdz~%m;YWD&;a9FPXFSMH@RYctX*gjGX8FTF8fgu7;{L=_*VLEey7W(0G2|GU)Mra!Zg zc;`*-OiJI0^b&8F$@Zyvzn8S)6CxO#3Vna5&7d6P$kCxKU>z$TM9i{7{4yA=lZ1&f z*jV#>Yzm$?{qkrmurD9naTx;_=g9C<_??Q_8 zT{OZXZMQ~8V<6kuX}#Aw#4<;rdpkpwQ9Bb;3p-^!U*yK2Q!Ttz@O?)H*i8IU$hlQ+ z>;sgAr{Ghk)iD~?PiHUUpOU6F)=o3N%>)HvaivYA+7DehM$2!^pSnPU9v`@Vb0$#!Ku-nw`2ZgvE6 zcOyF0Io((5G?)2tm}b~)MWnO{{y@yC%tLEe)NeGw*F1AS-@)K|9A-=GvS-dY?63iI z_SQqpM~=y<$rV4Jar9>|YhZwrP-oU6#MSXGmpLYqMPb(#D)>WFnDJXtLbBPF$C1Wg zZY10CP5d}j;Ba|et)hrg$fm1h#q0{E{I^3KMu_Tln`=!>q!Pm9X{Ohn@a_*?$H{>z zz2$c(NbNBVq0ZrOdCAS3T1C6^RBC)Isi~8tEgT)68(6%L&D4m)#P(D~eVh2k{EAc4 zxyP9X=4hv70nw-oU^ab{dH9_v;$F5N1F5j3sU+tj4coj6Z-wT+BF8 zTRpBD%xry)qOLLiy{Q^DQk0S1Bc+Egq!*f!~+f>rg=g0~SVRhKu4KklDhC5b9`i z3I#LKN5UkNYJxN2t{}H>dl;YN%8D)1Sxji+p=c`>r{KHd>N~000%tIb%6;oB=ut|( z+xroi%^UjI0g@Bw_3_6qiwBB-)(7BLcsHppPlpu7zK0OA`o4#3M?CS*&dgB?(wx*(OH9e{ zo?U0d;(~nHS_Vw8l6~2=b;KvjvsFKy7$9-{FUuHVb#1zrUG~>uGjaQ&f~Cau*2|{b zX2sz54Fwr_BXH=}D_vkyJXtMPryITI|>q^bVc9iwOB{4;nCFJ)`3&d2;qyhZl)t5>^ zZrO7iqD+OdOa`Qcp8Im|25_{BQy68uo9px6N(h$y*A%1`d_Hrg0dK4kll$h+ zpJy%TeffwPP!OJ`Ak;m}k#)O?mkaw^zb%ix_iUI6`;{N(oUtO-AvsONWzF+%&g&4?XHa{lJH0!6rXmahUz!|d925WLH z%`W+a6g#2LPVyaMm^>ui%IfqpbS~WTRxksqb4oN={T6KI5nF+I#dY_tN-bJ$?p&YJ zAF3heyYI)2{-&V0R~0kUTEeENX*GXj*lwq>F1ZGf)I7Trk+=3{FioKCeyw?pzhnp3FXtOT|^uq&`@t4fjvjn~RN{wiY@yGS}|Ngd>{IN`^P*fDc5_g1eU z1pV5D^`(;^L2X!(26%^y0b84&k9OihCwFpNhKoh1Ye1?`P?-5!H}GdGR9zyeUJ0d8 zWms`?PB2If9IW<5Nn1obFpuz7@o~xnZ2|KX5yG*+LlPO6`^$vyuFH&m9@}|+qcW?U zY|FR1BO#aYA|-@r_gRV*55G!F>E@6(|pP%QS6&!BEl7 z^F9ftf$zfpkkodFoan3IPYO3Ns=V=nq*R3CXT%`^^0k9MSlg}|)In*O@-(?2w$Hv- zMYAo;k+}9%gMcV`MR!@JCPob12Ax{PcU!nfkTehB7)k@P%O!?+P}NUaymsfqe?5wD z#BC_?4TNHGI_1BVS{gs^-3S=6;xie3dJ%9(JX|}0(UF1c^92^?NQ9?|1mPW`obA-AbMc=dZlfnKrWwF?mX*v8@pMGz(4n-x* zw~UV@87;={S3u5RbZ9!Uz|Q3jLO>n`ZcgBcBu4q=Shek&As{vMqCc@vjLA!*cJSWr z;n%|P2s;jg*uG}!%$0pCj#ieeqMidACxrj=Wphbu+;KJ?+iJM*bIzzge_`#2$vhR9 zgBY3+ryX+lbF zUT?ca#_o5XQj1URU@UDvAZ;Up_it)|q>I84mZ>7}1!vmNfz{SV)~E(`aIj&viun{H zpq<=)nO38qMdqD94s5N1GihPxHkW+mW+qIRc&~>ovYS?GhLHR3#-}Ix6z$oCtpRWy z`1z^JZ#zlMOlF&V3VI84c*D2jF!Rf7HkLsbI3K`;OJWOwFPTtWu;0#Gev61=?a*)WAHtTqc$MEhiOWO`d}I%XiDF zA-y%l`sWcPOX}3zNUlptSohG{$0y7o0nLGv`9jtW46~C1+OZr27VezH4%urf!jCg% zMQWGJrDGNghJ$aAiZy70Rn^Y` zxP>aTsDv{!4)YE~0$bx?)5&fittgHIWy;uhdwVp7KF2KjAMSkF+Ud_H5M1tXBaWXv zntY>x7d2gBBp7iD`(L#d_nz%%ZvW0z>Ri7y;UVv|Tw7R<@tF$H|1@d>5udwR8mK=7 z`#j~DJ!i>wEACN3tQttdv590O;Has2bo;?n56Id_nt7+r6rz(TcA?Xr+-I3L+%A~= z8|g`4VLJ;=9nWwWGbgR^H(@h9&0S+YU{AzXVOlqDHiGkBZfKC znR?!Zv(0BJveC(D>EqG3VO|R}()k+CKDD6gJx|>g)4NxtEC*VpGz1p%Mx{(d>LEEH zN2zAcrq{q6Ed?y8$06|CM~FV}7VZJj!$!vf6)<#V;?E;=?E#E4Ek@bdTL>L{Ri-T4 z7&vG}kLeHVgbkE1zr6|NLb@?b;g)x}T*O*z^!HhXFsC5&wvLP~ zl3hj%3k7YGoJh4wLw-uX-LCc$^SJsP? zrV*Yo432d-u1UT?`bj-ts0q*%$7oDnUKGk9x}e9V*9nsf%`f-Jtca)8+QY3}&Dbpd zP?x+*#ne;>!npCG=YXn&U+}utLFpEJP$LW4P`kRp=_^&CjWuv^Qsm|wwmS{ey8HXa zi58RSRm)nhbNsOLc4zON-i3wZhCZNPWhUX28r8M4^grCirWVG#`>~F{PWE1-lC`)?A%6Z_iOL z@t;%PbI4(BZo0z_OyDX#v#(k=dfKZVUj6xtjf{AU$I^q4- zg3=rWyhq*IQ~DFQk#1We2^~RsT*4l=vD+a5hYp-CIfKW4^GUWCp!@z?XkR8~|Afy{ z1oU0f?tw7;&m_>HPkV8J9wjbbk2^qfsqPcaTbdG6F)Cml zb0^NSqzv+kote$Ku&ggimzfil{54|`CIX9;X;Ncaky*y%NP|I(huyKn#<}%j)<&a? zy5kPuf!Oti#?;8wH-`k=S%?U0GI)AbR2rpScAAyJII>3nq#ZF24lJ|B`?SG6*PPJv`)K<0ZNy!%h&Y#<>9p2JNT<-k z%fnOcLprY)WEZGU3om=c)bfy@dFx1nB2G}TXoDtNp&>1EfYMIh7h}nt_<^%DGfMg$3Dma!O zVRHVCAL(ZBMM-kQy?D6X-i=3vYkGM?65(SYu2qBVg3kEtC^f%ny>ljKI@P^wG4N?X zmovCKNJF{N5ge1ArDq^YU^&WwZ+Q|=x|Hsq4_i1Tkvgu?+x4^2W>>!BCH99}YG7Ol zPQ?1Cs-;m$VZ*RE-^EyX+SOL?9!l|NEL0{vx9}u~ksDZhDXN@hD^l`fP5fv3o5I1N z<3wt$l{d78vps+OH#k*(^7RYilee~9Jlx(gNplT4J6$zuA?NJV?bR)?>uEDd{6H&( zZ+aGAb6%aYIZ~t74YLh$Tsqt=%tw@Sp2lH(?~PPUoLkL0`kOxgbZ-A`Fz3yl?^#jx z)>tQ?A~UIK1$((7`ix#o&EB)7v_4LmMaOIHO-RUxXFxik`5{eZZ&cW#9%Y(68X&1( zTD+m`_-gZsNn>!W#5ox7QO-Q!EF+03lR{L7nw~8v2^?*VS^Dm7kHp?IzyLl;nKT+1 zF;qqd%-g5Xr=0m2_o$rb6l9LWdt{#t@T#)eF}izxvx20(7=A_L{uj+#T;KFm6$@>0 z_iIJfMURHN1bOX(N!_y&zfbseLpQtyQo+VtfY@`Cr0(ZI35BRRA1M}SNY}O}DSsa> zFXDCN4H$f!IK(MP(_4)Z>w)1G>0I2V%wfyHeQh>yyr||!?v5Gta6dqi#5a)YP8kFPuC) z_6gQGWaeBW%yUdSaX1e18?y}|uoP~FF9|1UkX3l#<_%uTG9^z$K9h|E6z+XP0ha(5 zVws2B7Y>)6UT+mS9=8MjgY_1;qdI@wqvbgz&8^>-!;c8wTzZe%ndd|JiDZ?687RSfgPeS_x#lt;1mu(0kgh=-=iu^3X_~zyO9kArQsg=s{(b^ zLO^aOYZa%{){1|mCZF6x_y-zwL9IWvL;!4(N=0~^c`+HHA&K;PpAUKPk+@#;HJpWK zocx1l6hy(>zsbLI12&l2i$q$+(Zu;rEK4v+yRcm{Ss; z{D|x;3s|rx%k_B(O%Y#*S>B<#9+2IwnYg z4#2UWS226roHIW?73^1nd6M?Cwqjee0ida$2@0s8!oC*B)iW1`U4RJXvalVW3=t2~ z?zq7k9RqM3{7Ak2_{zV7<;S-w(@L#&WB)PNd)*XxJJm>Z`KzE_W3cecc;C{$am<+z z4Os01Yguf@9{5HDx)m^)k)KwN@qof#HT3Lv2K&$19`gKWvDBV=eI(>6Gp#0j(Olm} zmKF7||5U}zBY$kxgHJ6`fZ-LG?3MsH>J1GmU5@Zg zi5^KiI5y2jBb&$YqHpWwD>zY&l~K4s#unf`M!2d5z$B2(Qh;4e{Axc*=H705RQ;mR ze;W%$5B%G2XHK6&^JkS1ciNd`Vf3k0?6Bv1hJYD{SjL0yEM6yEXe_MMjLbQuVJ=-d zj?AqIEIM~5Ur2_4LJ;bTHTm(&N+?zsT=PYZptoY?OyNw^wGnqaI>Px$=zrKiK3CZ6 zI-xqqYsZ32!8ZtffatsWu}TPZkFZPcR-FqtSRBwdki;Jm=l4)LWmmrfmA4`%l8*jW z)SHY+?2wY01d9}!0CAu0?F^iRpXxWI*FAS=u2XO#_0s6EbWy!5F=Nh0ODAF{mH*~k zK?=2#P<^<|p-0t+qsNP`SE60Z4#iMVe!nx9xNqrln7oyNte{aWv|#rxN+-~7_;t6- z^2Aq@av)UKeB|FYo8eb$%rrmiIb8*7Zd%$+!U3C~n1beJJv}y#ol4cXs8SLcyHE$A z1(fSu7Lf)De9T6Wm*-pZhszV^vOp}fN%-wHh~>7_YAmr4o4;t43LYoS3ZoXv1Q%*@ z)-H-6(2x-=0OPOmRW@!bEiKIywa~x}_z&R$Bw!YHj@IRG;wv2k14s-yoWW;TmtKJ8 zhXtEAM+i}g)sjvFT4ZCyysH~%U@s`C-hXw!z79c3T5)H3x%`Uv^4w7!%)@oopms^> zUJ)gzfQ~DA6YSwcR{B!_cu+ph>+Z>^>4VB?7kl=^{)H4^1&Ut))Of?T>~M*qEFQSu z4&*GWZ2mT(biYxeE>k^HnhDVR=I>nl4ak6n?zb(aPP7woPQT%@wDIZ91$ z3$O=g0WV^voBhW2hE*j51x#=gw=pYNs5Qa6Y;FgX&%a1%Ez3kHh%@!&(nevh%S(yO zkEm13{7z-aKO7I-@9U`nY~Mf+t276Q`F0&2sk=Jp#%%ye4dDo*_Uje9Gk9x47i~MITRUz&JEd7cp1A-0_W>4pw=Mmd=AH0B}|M zOi%BKOlKDW0K2oNjU%O7fIV6(Ar!*^xNs~|&){rah%!K`{%9Co7hMSTw;2-Uraq|o zh!BD0WYQpQ)(gPav4*B3+u@(NpeU>9*vRnP4V}{+Jbm(ZGKm?GhiixAWXTe6^@f!T z??@6@)F+NY0&=0(NQ24}chL&%yVqcFvCSfi`C{xzA5@l!0n58ZdwqdNoEQdwVV-~; zJ8?Zf(3?E}VA8|B*P@_bGKuR!E4n^Ba0o&Tocnb}D5g;sGG-Bmw4mg)zZXD)bSBpKjh4WZBI~9Xf9&|})HrgI9+TG29 zjWghCHwftKEHh zJH^IVlb)j$&}qI3!OJB|G~m2v;1v%!gt}Td1hzQ`qY8PBCVteE*3T{I{iT+vrca}u z2dRVe9aq2(Y1s<_N@ZkM8nsi6V*O|uwtHUnqlcqYIdNgN6AleOt*e*Lvj{O3s}@`} z9ATU+5oy#2LezO~H^xfjDQG+zK#t1I)+ML5d}r&!8RWl$5556ZdcpEZxt}XZeah@s zUsNm{SUV3M* zQMw-^gfQ{T0fgJHih7Pw;c2{>ynYGxFg=sgI(z`=1pULRsPhJ>at}AM(xqeh&R%sS zlo`-{V%NpkV;-ctbeue{?Njfv2$MX*12%6YQ4z&qK`!Nlo47if9d>yhF73TtUj0vb zT7)hg!EtDpLpj69OWf^B}wf1D{~iXid@1XKl<$Q4ts+YTtbX)SloUe$zr_O^Np`JzS#0&`o5K zt7mSG%5~|p!Q`8)%hE6@xVjhs`tS!jhwB|KK|-#1-RkXbGhs-tf4o;8_FJvySH>EM z@l#6m*tU7aL=NMVgMUvL8rZO^tES1<-EBjut%BR?0teoO1j1(9MPbxtnNB+Vc6@mb z=?Sb-13?)%jM||^|HgzD^@Qzj9nQPs_O{9oN?vh5J1scJS&fHu{vk9{?vt+uwr0QU zIm7%I!!2H^aN-sI+LI9j_X*V)!p)Jz?Q%EE(;FF1u}}zYL7#!p8iCZ`xW)G>vL_6% ziPG9Vw=iA09ICm6@Yu%nB|&G*(k*Nk%!1Sc%-`EL_dEHNMYcmKuI~Z{m+>+8`vp~q z#K~cy_ZV5RhkjNkTUL*8)L)JOnDSQ*luGKF{f4XiRTHBG#bR8*G3;ucFvU#)`A*RT z(f#PO9p{FzSjzgW5`)-d=}cNKm>Joj=dH-lQ zNIm-{75g%T0d3}8O)BsPO52kre0kImHtz^}$)Q>w8Rz;;Tvz!l0 zU2uTJ-Dc^Jtdsex>ILf~{{%eW4~tJ?pAY)?F@>7TR6$fw=d7LQBnxY%86IfdM4R|e-&xX{8t z7`@J<`l*#eQ&cr@gpP%dyRJ1$13a{3LhD#Eb$3#^mc;-0i}H52w?KmnWCR>fQ+OQf z+;0(X+QsA9ixQvT0-Xlg>}i%vZ5M~TIy3s}(n~@}*DN;9PcU>O846?HB^x)*Db_-v zPb@=~R%o;vwP?6%kS%mr`wLxk7rQv_G@`x|jF`E9mLLu2k9csb_jLF8+Bum&SvdZZ2s>ro_qg(ZodojspP4?#b`k10hC&hX=^D z2iNE(XjP`eNXS?;#6l&k`xiX9{Oq==e4Ao%k&zerpy4tlxliMj?Yl2uN@QZnZ(ee9 zm+M^C{yVC?q~`h_B0pAxS)Y*CG{1)^6FXEbfzojyhgc3<@Be7u?a;(^ae8@Oi{RBD3(<6JYKz_OU1ZV}(=dwN^Hp!_qV}1_PG{ z{-p2ihyPMSSy}Yv^GxV`<%{X)5Q*&P~p2Rd$(yc?QY-iIc@X;P+xLgHnP>9}eUgZdb2d#@jGi}rbD-ouY(Wq3Q`-th zXI*);5zVgo<;S)g|H!OFBp}9?_)bb#JI(e(bRVN)SP*HdYR?ykxhFYe(wBdfIRXFr z78lCV&j@_BIN>0A_VAqMl+m6}DCVts2JBt`M5Oek)g1tfQL#3b5Yw?n`d^o^nQ8PG zfm6oEcL^h(3k5Cw6&n`D2oDj>CAb5|bMOD@IYz0J^H)4O0{7Ktn2*2`#jq2=s{o_t zZuaetD3HGV`|&$o^!L4)(pyF(CygeqZaWQ(RyH#`U3(pFTbf36Ft}CtNQxF`(t#MF z15RBmjX9?L>>l{`=xk9N^zrT|sYrYFoj8pBv;>D(NV-Lo^riP5U}0?J?F?GXBd9om zKcwD^aM?rWm-Jq@FkrlBbT=c`sXK-DA#yx~5p;d=OECOPMHSOMWaTqXfEEF%b zwUI_I=gMg!CR6yi52^z!WZx-~OO_=;J;+s}gX8(OE}oiPQKQ|>35a@(1Bb)P?f$f2 zUQ~5V?^Gl$u?9OP+ako>o9#_zBIz^?wyX>qmOTWp8hpW$RL|CwPz-xs#!YiU$x!WV zgiotU&QvFEcXJrQV4W+KU2A(y*{N!d7$R|t1<1HrZyLV`c#XSqB0GcMxMNj;qKw(k zzx1&}uqy(f_rNeXaq$jwW4Mbc57(lnMvS7uDzO34TOue3dO(~#nP@`w!1OnMJdZ488cn~DcLGTpx4hRK4hX!K>C+@Y_NVf6uHwv^)MR1)<7gLBhx6+PqLdY# z!)kdE#m}QxVx)rrj{am!uGi``MQMzy!|iwbt~k(*+-q#-UQ*TL(8fsI1AtT7l7#f~ z6{&t0w+wnU&YW7f0*%8Iyrl;`y9doXuO}|JeF^`FW1n9T52{hQY>||}l0b(|ZF-1| z!U3nx5e-hqJz0bUyCOhD$>{6;+mLabRfze8V~GBOTm(J&`ltrTKqC-R1OG9jw<)cH3o0$U!7nRm%Yhp}?J%9vlPsS$!E5kTlsm6uVgt(qYU2LCS#W$7GjlN24P(ENUzLthCVc>AAn^H+0R>DsJgO-mv};bhBUW1H6q7w@*JpBip#7q3E8aw2mg<7R8vK@m-jv%_k9 znwjMlDT)P$>z<*I@H>~_ir7@6kaAaEXS-5n+_XApQ6-aQ_Ej=xV{glUeA;^AK=)! zOjRK>opHr!8ueLjB0h=!K(xw8z?$D=t4yT@MB<~!Q-I1HlI@R%gv&Pi9ox;F=kG;+ zeQr%GbK5PQ8ActLsHD(K>>y?EBpG|%{j(M*zH==OqietRB%O@lz&%e*MUW2vCfyH* zglqib+qM0y-g+AlLjz<7#LmAZD;+Wp<`i|#aB0(FPU0|w_aC5yUwl^5ju>;Jz>9v4 zrow-Wdd``ZE&cEVPC0vIVUttRvzp$AubR`QH4-OQfXsPapi+a`$cRGHKES`i6mx)DyEy1qBNx-d*{r?#tO8aohlYV} z;ML5me|LsTKa98()t^2i1uO4xt zEcgg3Bq`FRA0QeeV@l>P7iCcc;t5I$>Y(v|1kCX`j}l)LCF`j8=ljfX=`9Q?V2;}2 zm4f227Btq++)OEOvxDJYk<*`UEm*pqv4u6gwcm$Jmxi6Pl=$j%q3^|^O}PdlajgZ& zp=i}dpqE@|>8#>_&V9Pxmr1TFrYg30rJDMc!(U4ZE@2SC-qMx_@2$b)?16p7NPAksTkY&fR*iiw%Ijh74lY9Isk zK)7Vz!CzRIQ|pO)zS^a>20g}0k0V!W+D}@SE33VyOW8ky-9PI|;Q&Op1c2as9p%Xa zwTt9w>IG+P5dc8ZvfpvQM4CLi7M*;;AoG`XDx{tqz?3$eX<=sJNwH1l{E<*n;LXwk z%9CA~QjIfy4)^^CGfoCnaso#N7;~i+{fKhnIWpyn@08W$$hFzKp6>0_)l%_@j%s&Z zCUn*=`;hXD3OLuhB@C`` zLOgkXX$$`N61QYC?Ra$)FDko4VO@Ji^2mFwkIF%M_>TF(&L3X~&z}1c6kh%?*aPY~5j)>k`PszfyI!UaVsU`dp#FU%ZL23mJXP9p8B~#{$U8(a=9$ zTr;Yu8LGCo;uYmV4$0|orp-F2&IuV+lD(z_4%`hZMX1`4^QwdF7PYaKpb22y=nbWy z7W=-ae7~hXzb+vGze@d^wnscxSp1sbIX}iN>vG_z4&#lk^ZyB`d}s5ylnHSD9e?~8 z$8{Ft-ZUaHvg9r@;R0MvyL4kx+d^h8_j?p=ibAFFq6#<&YQ84^ z6>s+U1Z4>V%lvK%rP0v$KLFk5aKD2s!# z-*MK?mH*kxb_Uw9r?JS7n$hH>$HW4tG+IiVdxMT@&L@JXShs*4pPUe<++hT~pQ~BB z)=tL~`CDXS9Hb>c)q3Uj)7vsE*qT`-4ICC4&{m=pl!BF9|3X9EG6%`z0Y*9$;?&;q zFb-+1Mex|DY10+tlR2}sx+-cWwvfE%uZVGN&#if-XfZx%`6XJ$JJu_xy0i2uus421 z6;E&5oW*wduDx3%Gsw1mZdSa%C+i5&5)LV~ljds|Ndkq!_t-9uye(=&lsgU5ls`;4 zObC68a{e88USVL33O@T=+4)d7(v0IzF6OZAXHA>pRWyeJ7sMc)BMHmm=TF^&sWg{{ zYyZ~nF;eJHtW7^t2H14{RqDj228qb$CL^cSlQi78yj#Xn0?^@C!~AJOJ8ggFxG}Jo zuZ;w?2EIqm21MSh2v}y_2)b1|@avS}n8bd@;z#55L)4bKynmW--PY;5Es?T55t=>P z%hCPjL1=H$&O^3B6lRpVVqPUl`GBc>)r4eu5Af2ut(sV3)KvGNNp4nOk1S!wH%Zt3aFh@D%A?w0VUu$t9i&(dpvTnx4 zRJVv$(DW540ZlWxOcoY7Wk63|63cMGo~mZ`YctXK_{DD*LJuHYs67D z1X-d=I}X!k{DfZwZJX~S8~BK2*_AZ+%EK3A4N9Eld{!t9?~%%_ z4z3h*pE*yv2{YANzv+p)o9Y@w^R;2aOCavu;Oy+%S*aa@o(Oz;a*9l6)>UfOV8hhs zJg}zZ!Z<$;vbjC9w;HkQE4~}Z=GR4o%PX%6!j|q7*}Mv$pU;n(wHx$bBfz)BF0zgq zrop=R4J_I_XJz{@(kvnZ&SF;we@+JY+&S7RcACf<&#xvvEbpW_5tD)VETJ9ZYq)z# ztI%47F8Fy_<)#S-Wm~X`2%Nj~4xQYU)ZgsMVTTC+KKuZC zMF^hL8%&Id3b(k`kB{deDEX($3-+@S^km~*Cjvm+&osi#Ve^NSI8edoMF%~-RE-V&T*a5 zeC`B63+?z@H{%GphqK5K|ErZHpRir` z+iakMBUkS>?3~V4;ymQDiKeV}dTEBd?d~ z-A?Fjqv*oX-nUSnK(stn;o#xEy3CV#_Owejzc~7$VwK4aKBI9((VnIjXlmZfQxLsj zBOYSaaTI9{6p)CL{)vQ;5wT;TM1vv!*TwtCDLx(Xm`D1V#q95&;@ub%)yRHeb~zd0 z1c5l#XzDi_V1q-s4Ck#!*K}E7#iXR-f4%VKl6bMdukhusJs#5c{Io-1y7eBCWGREC zKDe{4f?+dER;;Vcu$iy-6Q9^*3*g<_9{=~VSB(8>lpbNQ)fuEanzpg z|BpP|#8AQax5Jxa_>tE*Uo6W%!iy5A^`v5fpH(F=$$Q{9`2Sq^aP0~56REW?&kZKe zmyo1j3P`eQC>EMXP+ho()V;MQqKVA%jg<4UUC?ZKZ&ciq3-`kDOCDs%AAi^=w9V!VO6Fy=e815VF5droR01n-N*$iv26tZpB{XQetS< z69gFEdskg>2N0n@YIP@*4~UIbbhV~3667Xu_%Hjb$>s(JLwnDf67Dh4t>d(v=R!Y< zD|{~$WXe&vyi>tCdn_k!-&FtKZR&j5XKRg(5B^%Iy;gwlFA~*f|2xZ<5^tMps8)dF zBKXtB_t+ax|4TqL#fznm1~A0{d8S-RL!Td37y=n&DXI@WCMc@b_+r$t(DonP+#2of z-IDgdU;V2WX)6==2sLi8#i%3~3BC8*?4N6&$X@yXfQchRl#+{aBk5u#!nx%UVF2_> z3)X})9z%4?AzOj$z3{*4 zIOX@n|9gqOH{2W`dEbzjqyFD-cX}+~U?Fab9ju(MJL^5GlF7R7@|S@^;}jCl`a|UP z^7H-+ZGI%(fC0$R@(b69?srO&F(x^&1mRSoTl)eCssLhL4wCm-bhVQG7I**k`orNB zK;myErpynr@pRZp+(lk{v%}KPd&p6tNK5o^Laa@u0C}zI9#r60r9A?WWwDnF5ySph zEs&b1=xud5Fy}-9^nsR4c+nSc>eyue6vg)GgVVUx#V(*kw{{H}HJpCQR02(Kp0f{} zS4jKEJqMF0{lMAI3gBsg`2Wv*R{z_b!&%f9ltkG6^zGP7UU%TY{N7dUklVKGG7|)> zsTl4&R{;fhJfzbkRAipd7&>-k59D<4YG+0)LueLzcf1kgzvM!(1wRIrjxv$HA_McK zIGl+_jzXs#PALqY*i^t?LF)(5oZpYZII5>`KxbbI=p0_G8^lThB4|Q%a4PhaahS)P zd*(EpVVZ8HE@FO`0i^E{Df4Kg#;b`hfTNi@+n~pkV3h^>p?_}gKwweI3fd!@%qKy} zceu@s0di(5cAl*0<$mcl27vY3`#$t${^1`PAgoUfe4Tymhi}R^?+YCmFt*I5(pUk2 zuuWmF4eNec5&@2#N@>sWHgW3_Kn4ks->!7*E9-yAX47uv1EHtvSKH;Ru6dNdLr(;V zs@7^bPA0GU*6i;yBo!cc@3aZ%cD&$F%&gTi0$j?zmdUj@IvaC7@IF5n_`-^WkPVi4 zFXu%9X_)1D(&ZB0*9#?q0Q_!$mHhdczgV;2U&N7?&m+h3MF}96f<}f~>tWk#uYV2M zzrzF>^ZBXfXB{IY&+)MoOf$ z?lw+}d4`j3U>qEP$QKm~>=`KkL-^}seDSIQ(J|bNbAIPOtr42~6Nac|-Mra}*T)qR zL`u{y!skPh0@0wHI&)W|te;;2*3+P9&7P-Fm6kjW2spc8-Z9maXqG6+0hx5G*oOG1 zU7;P%RltM2-*)a#;8&vhPPPxv6Ey}R>WXIu_nDnf@^;T3pMZXn;6*DcUMk#dvq<=O z=iA?lDa)xs!@`_?jM6la7hqjN{j9@~CkM_-HNV3tc7Abj(Pc5D)pL0=vj8f*VisEBh|jHh8wL# zMGQv@a`2lT%liv*zBd zT->YFD9Z>IOS^42{loKcg^TW+M<6nx6ZCiY^LWL)`|5fM5O)$IJ#{=&~8q{jLMSy002=k~=%cJQyH)2l(a0avqbp04_~QjdmLDZ~6OlaavyeE5yIM);*+H>?=WQQJPwh?^d`9IT$qnl(BHcW5{|W<)KhCerYm&JV-za7c+Bt)XfP!t-+SZd`zAXM>H%l_<@& z5B9B=3mkb`RBiE-M&@*Mg9&pCB`SCu>wC&5eJ3$qnCM<4M1v>-qFS!NRs!UqMOtUy zC9vefv0nFrojKXw7D;-G?Y(Cuu#A_goOtlWga~4xYR0N3Qj2!UQ@&qCDK`#;G{I0P z%aW5tRLa%c_UQ85$npffcO<8(KrsVrf134cwf5AdKjJ*xHN(xbN=6{s4<*Sjd=y8| znU^0D5poqe$85eezV2X~Pmw0KNQ9m9AN-HCx7W#P1PnUmX@I~r-zZ3Fh!WWkW0D2; zVDq`*qrlOsy`rpouIS7H^3~_(0cq`S3VI%@RUy)3bI>Le#{ShG2o=_!^p4CQAf^AS zz3&W%D{9mwg+z@Y(MKXmLUfr?f+U0#1kqcVAfgUYMvaIXW0WMKCnQAlUIr6U2BSsq zgTaKsU@%6#JLi1oJKs6?+~>JJ?~nV3X=|^&*V=pScfIR<-`&n%b|CxS8T?@nLTdm_ zXf|{uR+$&?EZ~f0mUvG6l+hRGnkIZW7UQKytFAIG3YRse!RVltw zof(VD+_X{`Io)#w=`7a2e>LfMjgpRRZ`SCSyY9letjzM^D#c%>if!X=(O&FoxS4v<+GeeXPw>S5XPgc#^W%sUYIgjhVMtWLXC8?%DBbd%z)*%}2S zU>BbMRzFARBO$?^8`N`?U>ab}e>&{wy>@JgDIyrzS!tb2+9tK(0Bl_Q2@r&VC>i$xJ0U6fWfxoX#IYdh`GK$ zidLghf2&d){gm$gk5^}I!Yz68ndF7Y(b*kP{=#!#m;wh%*A1^CIa5R^v>sOusE@^6 zBNxhKpUYmz!4|z$G4Al$cQ|d1q25uF+ll#TC>Bl#&C6j51SWc!u#=3Cvi2Ali()yp zt;*z5e?HbVOhr0Y-c0+=;Qoj-Qv~F`V5;k<)&+ z+?P^kZD_V5R3u%vMgxT%XluD_^m#;+>1MSAPQSQ7kUL9rZI}1VBLD$>?T++Hz=Xs6 z1YXnpJ52hEmujUWP_)-yDF$W%_bo2*s&0G1_V6WT#&6BJ_heV_1E=u!yO%&TJd0!M8QK8i>;L42zHb0B(R#o%HM;0?Przh& zF@Qnr^(LqG4-AFk{yXO>ejRsqBjST@UXk!$ zfV<>-`n7g+s@(`!E8KPfUF15CCKHxtl@rb5;r4;xzKPi?`?V@OOdw5KaMwY3Gr4zz+lm zP`c4|`(js+;x7&c`G4Nr3rzmiSCQ4Ub^~oUbr$@T<(ursJ5>y+1`&aG5}L` zYNaLsy-l=gkT||QuQ@Jt6|S}igo{wCd*84_Q)VANg)eBAKRlh@L0hXnj(Qe@{DyfAnf4{f@ zL#l%4(5~Np#c6On2^cEttUv(C3DiIy)Z=eZ=Vbwck#d||5e?boX;Quiv^XjQDGdEa zI{gjjozaBt#5alQLIdyv@BQ8-Kk-YA4;EP6B_{=I3gZPsh^G70Bm35_ffQLE#q8!N z1#~`aiQBo5P1y?L`n9c5FT-LCH!XSM!d2#0(EXU5P69n8cbK-`Z%Wm1yVfFxvWbM% z5o{aBOren>SeM%)@R{O~?2%jxW!ZSW_OjR$Zw2$O!eO=a;I&&gg^yFtdie_7C*FB1 zwLxg-eU=<1yflj}3wja72udzZm&!VpXW6o7fk$6G0EzpOECT=CoCw!MEa`HeiGbqe!H*>a=VYbUth8=jTY=1w+#{> z$9W_!dL1<XVE)tRm4hQp2$5G+z$5Wv5JQu+evB%aHM=(VGX!X`52` zz!oO*!*usck>~m2gh1`ngl+_i#r@j12~Ir8Lqo{UU8Mp)>GXP4P**_BCM01|d3;w# zRymO8sJy>8%iKQucjq(Z_vv?+_3kJ6yr72{{u0dLA_dlsOdXdiPr*6!n0>avVl0e4 zFYBrIo?9sQ`8F2qHnR9S6jFB_mmZDy_j^8r71TR##@Runs%ak ziFhSEUxSnDk*jY7dTyW%r^e)bmlb2IbPTZHy+GoWz?j=nSaO@0S`Xo;Ja)}D>&dv< zr770Wp3DF?&~p<|POzVJ zU4SX{#?PO!im^${9+<3|=Ao z{1**s?GP({5rfk+zz@q5e(ilAZ@N^Cvb+$0TVjSHJmQ%2UnchuDYoWyW2bd{7S zd-;1r=eY#BHRx=$Rf>i{vX&?920&~42jhWt-rLiq;RYtu;a|A_SZ>wqHQjo8n}?k{(i2n?_npzp72Hd`LF{VkOr)n9X%cl9q*@^CjX>_4fk z|ABn_uXNn^Ifx<~`S)pcxbgEby{J3DT}gotP_fa`2m^N%;M*Wk02?UqIoA9o$8@{S zFEjte$Ft`FE`sJIB-0H*8UNhkYe>t1X8P6tJg|QrA?;^|xMVt-Z~vfa{#oMRUVNYP z3kC>+zueD%769rZ6M(FZ{~=E9Nt-Q25ZEgiBab?t?V7K z4h8tOYl#O#DD@896R~(jv^-6EnQW>o<^3yF|31gRtPK!tr+tl*@ACTd-9?xWaObQ} zaoe@}d#f9L1bD4ZzrOgdG~tlP6!X7gi2q6=YILd={B2iYn=}`M4^)7ay?-){7ndDa z%mrT`!D&9a2b#47#cOLdNYPMQt2f4uw2yF9_QAajv>M(Wg)o~io1H&TG5<-hT) zCN4j2`vV0U>*YH}m~V0IrGG(n z{zzKW7q4cRaZbYgBphOcuhy2Y+KlJiL;iNwFbG@&wo}=|vco#6#|}`W8;ZMqO~(-> zpYN4&0YO&n=xieSxVOPZA8614t4HNFKJk>Z_G@p3;E)_PnVblLZp5eD5GHkv=X{7m zIXfGd<6E1Z3p3KhkgiTc1W@BBmz=k<4Rb|5Ip}*YeTz&yLc71YVR`^=4b*)T1p5~GDZf<3)m_{Z8jGd{V2llvU1OPka4f6k0BapIlmKk@ zE7v>exRaM^v0Jwqqp6n(sP+TL4=Qx3qRj%*IgWmsiY7?-gwB5UT>w6*eE#DX-<2*p zzZS^>5NfK*fo1Bu6}=%i;0l}iXqWtqm`gJgEYWxve-)W;J?>VSJR`iWx=$2>RDv~gqy7+zgOrD z0Rb1z>^BW)Jm3J#c0AS;MBW=(=j8zNTmq8nE&?hae?o-I#}-?lVebaTB4yDb?#yM7 zzlAt`>%nkCC4ffT=&xqDHK*1Fm^#i(Ljz;ouljrCsP8K50T-TMm+HRZ-!qv6(IPfZ ze50TzSkDAiIQR!llsnp=90c)7_@Rw8o-2`LlTIf;-J4b*XV@Mrn$-aNGmpEP+q5MX z#*vu?bA55S!KNnq7_lt2w&A|d#nWD%@B%Rge;UT7to=srRIX)>V)EK_70@)pXdcI% zGFcY#apD}%&r_yOHA@a|so9SITfX7?2xVzH@5(dz6w>lNrV z88^mX<^+M`eMO|rx^BHQUl%T~BlsjE!N7`#B$V-T_Fibi$#p;gF!aMdJ5##2MufA8 zRidR~MV`s!jag)l<}@~~PqZB*BSAyTiz~tt~dVNt$XT%Nbb@ZBUZzCA=<;PY-2_G6Q7*2w% zgZ)b%0eVj!un&{_Zli>ZOFFoi_Xfe;QTg#`lyb}di(nJJW2&3{;)Gbs;b7?r*?(D3 zwoB}4i!`%r=_LF29w@8E$WH-{=kj)lG3pW)cbbU8i9c_HBnj1Ky+r428uJBYP6iAn zF%x5yq*9KIBG9bWJ+dcLkuFP|Wxb;K!&P1s{3lwCiMSPLHL1W7Vl}mVRCO{X-#Y<; zDcRh>s~^1x`xHJFd>(YJeRILxJ+@tUnX_VbvnIxCof&0M6?o%S zfWvc*if&UhMFY{x0()Dt6Rei#RhQfg@9S4Dy-9>Q9?Ud$;OW{m>Cx<4G z*42|eTG)ZLY6t&@7S+~iw|1#A0=Ctx5iUJizF{Nd@UdjCWs05+Y@Wx<{F|OR&al+= zuBUkc>;&;l-Y$8DO6trwx%K#LF4F<>yG^>X-t%Yi>$v?-Av&L{rsX@Hf~3wa%ZfFJ zbX1dV$p_{Rga(0DIfGt*Nvn0g+g%-og37E8hJx=(BIingkbw8FGTcqdQP(R%CcA+f zTGu>JZh2d*56kPgWI+hV1ZljJ@Gd-51U(>*PWE_%Qx=KjR9wikN+#6(!8=-F-?5S{y^b6;?cELj@B%b{Ivpl;s)!5UVPym;>d|z&uA6@B zBP&giWBb{uXlYdAI=Bm`MOuMmx3Z z4Hgajk?4@fBNHF~^S*T+cuChf?-!9vwMQ~P!kk-UC8IxG1>NpDuCY+9fLZK0^x~g+vcF0_jW3UYTY!99k|){AA(P`dm87EW&sW{t z5ctQ1eXbj!`%m%<7$9l1fbHH)jR$}-_0ENJWMszI9w zTzUXTp98ZrFs_u=f~dxNMOH&h;?6x^fo}f*hIr#%O+T8gKz_eOE{G)#<;;|$K;*lY;}|*usj9FL56J9*H6=Q#OqQ6b9L)yQOX2(h z!C%t#(LxAI(K!KUFoNaNRp=Dx^sVCqiqCZSB1kV%-o<2_LiEHs_E~*dk1r8YV=cag zS6PnoJrlK~Dn&F2pSDdVhtKp@RcN?}u3BSIlq8k=$#1yhmEv3j?>Oc5zIErJKS>-c z&Wk$F=ky1(A>1T@33DXvupiGyn_9b81fJ;y4YgaA443F0hm#TshRUtx&TCS4eK8;2 z(o0AFE>TBzhoM#Mj<}Z;J!ZFik7T&ZiX%&Un`ayr=o5CVjw-KveHm*qJZX`cDW4f^ zGGqNct{_pZxyI4a#BH*svXhiiVoNztFG|3g0BS$}8y{(JUCrxWrqbSeQyL#DQF5dZ-xE-&Yh#&D<7Sbn0 ztWPdoT0R5}k6nK+fpnH482gV6hG`zk@$%Q-tT{zJdISsjbqmjpZk%kajt!D-nnYWt z4JKd*1&r90A^~tT^ArIUBA&}9mN~*rdQCFv9UW>!Wn6<#(+gBd#MDvi9EvFTW&6-o z0T)?4-1A!@6+@UkmLl6Lz$$7F6-RJxGltI8c^{Q=TQ9+0mG4X~SYxwaz$J)Lazv|G z64?pdgQ*`WF+N-g8#_L$2fh!8K^N!8W*Ss#<7RR_xAg}_p??m~Z|`1LVmgIFzw|zn z$&w|X@m)PM(DVMQEiS8kKHBE-S0IV5c2NC1hvdpf$x8(v59RuT=NOl6q zu|ZCx;z9K7lbmrx%%mXlcS2N7aU%T5T`HI|+fl%KwmgLUI7MPc%?%1&BA2jZe37wO z87qu!{m>shW1zdlQfR)w1!vx4@<&cw?x+9cPuU3DVtOn|t@E9H@GG^0v84Ceft^ur z8VL|(!hBTjF=j@jpSO_>(os{DDcO==PbuOYH+Iv~o<=<}aMOtx(|Ck#DgcA2fW7;mGkRY`$jN-znjvkA375JL8UfIfVy~GIA|=YpRFAXmN9K5axI@ z=MrW8An=z~;vY719CMc1U6eD|*^|ElT*gQlGw;za?efiimwiJhQ^WMuKj@R>clsC> zrVZnd*Pzpxo*tWkjP?m6&W0)T#_pZ6$8Q7is9&AQD**)=3wO-RZeg64)vTxFVB2Xx zdIi8*zf!;F&1acai++2&G4C=6%WH<{do%c>dUxYjhtn@{aTPQ+^0Hh1Y{`3;^!rOB zU`h$fgQb7@y==4428qZcZr+G@pBc36!{x9m2%pG5o_HkPT-dXHeLc%(I0Q%-j9tpW zz#@!ii#U}|9{tEExJTLbdD8(zoGyKNtEWlvUsvGW$M0PK@k>jIe&l#*KN0g{db!^vrWX!ugYD^X{sYBfaoU9a0OJI{uao8s02& z(|q=3Zn|jeQU^)~7Fw~?CMjX#o${xuGC9PjFEX*jcc3=RvM7PV$44ep{Umc6jW~B$a9<8^?6C{t#W*WSSNdTs>y%p=#PxVF~?!y8>xV^ zZ^(&{pp?^39f8ZmCHsUUZ2A|y>>872EZUFgn`Yqctj(i&3U%Ikj(wW<0iF9R0nD(; zGF`xgFWaVwPd4W}o5iTPz!Y@Sd&Y&VqocNT8~=)5V89DukO66$`sJ2RP~2*sZd@$7 zR9@F`Kl($Q_iw{aFD-jkRzNs@6#?T@4Cu3Uf*ni-gOwYTMiuSv7Q8B}PeE~FZyfGV z+n=iQxT7nObB7^~(~u9%U!6v5wv?2ePipOY&?o54M~@nNkd>YW3J07lFZ8}aRHYtg zjkti_$s0tkn79WJ=65~&&jtl9*$Ev#kq4&t@`ND1JXR#pAv{FniC)N@H_aF&OhOl= zSqe=sc;;j%sCK+D2t0Sd`DNQ?TWhTe?i+MOw)4W9ezs}-8nZZNCXS8~RE*;M=3K`w zS>G&X;C%dqWh`Du-M!iQ;9H1e3`O$|0+m*K=Thjzp?rK0mSz1^x9x4|M(p3g!Gc8& zIgPuKg}4LB|CA}wZ!)fxVYyr`cQIXiTKVNKIivO+ZdsPR<8I&dZ5ZMmPN&%%C}nuD z6?O^P1@-dL_qd!A#22jZ)!1o71JB%HiuP_SZev)eiNsFR!&6(h_K4Qx{d?VLArP8n{$JKrwRcoPovpJF= zsdseQSxb+7h#q-r3dEV%9CKsoJwVT90sQHC*lR>s8i`*LerO<41 z*V#TS1Yq4ajPPI8eUPHXPriLrG_pl(rK#K(_vwjAgaxk8c`R+5zb892=|6Z6OZb_N z>l0zpiO_3{Le>W4H5k9x$WjF++d`gv9hcTBRdm5!_`M$7=s?tR3O&Pf6k|D=XaDL2 zoo_3CR-2LzXdIxtzp6RBX(%c>7Zv-42>W%wh%nvE(DnBXBieSXZ!F&^X}Q>eK%d_Q ze6w?V3aHtSpPE$SRCC8ofb`7C;&p|}iFGc5D@1C?Ynuj9813i%*0-!#K@ATOuaZET z1>=wQ&1Li3R>@I+8XM-;PQlG=@Riqok*{a5*of(WPA%Z<2s~Nj1>|QuPrz|&E$BA2 z>?FpFP|SMJI5rMJseS1+BBvVLT%h`s^26TFpJ*D7>DP1gKC~-LBZ=JFAg3IJI{kv) zaOu8Ua})pGi%rdNPY6FkB?G}`U(yxZVdL#{M(}hOd%M0>my%Iu>vTlpEA;j(w0x5F z%U7wljoigvu=LHICx?uu;7p6FGI7o&0}JcatzyvfT;%i-oaHOZwE52?3WfWyqhj!t z8{9!6=t7784D0oH%#>J{yFAw$D5QXj(QyNNX?3sfg_4Axm5SIMgMbDEzJXt|Z_% zb0g(t^*OE?Uwa@DU{p7Ad?xBfJVMcuWB6WiQ$>G~OMn5as^!iA5Tzm4Y!)*J z*6Q|IR@B&h`Eq~k`nr2jv142fCEG`o&h5jRj=mD96Z*pE6F%3EZ<4I0S*)k=O#C~z z26TSuu(NmDz^~WjV#v`dmrW?^WC(J^fY1F=t46{F73D}~D?>?kqVW#`;-U?y;PdCYc~#N6$#ZJa>(Ny4ejescXFVz1 znh0>7&t$BJwwWMk1br<-E6FzNiBJM&`C@KU&TEEBXxj*eF8o6YY4yA6q zU9e%^;<}L^g@3&*nvPTrC#=jD0$H4rxBAbhsrJ8TCbwjSt0l^#c@wW9za-2vd&oiW z#y#9ToC&&Y$P2yD|?mnE~TX4yGpqJsBvs`A} zdfAb`(Vq)NZ+|UUJ+oIQu_?Sk&1T!yO-QFju^iYmG7++yh9utfc$G?Fjg-sG6^kz! z5uG<(|H^7@bo|j0kP)rCh=#hu8#2wz4BYa8e!%U1g_?tLaLcYkkKD z(7t!e)p@pX$2S(onf3-XIDSi&`$qh+fUHU^$uBIVsrC)q1-ZSw;gzu@ba!aLZ-igU zzI#^mk2MBI`%il3vgQ>JKkwc+J0d;o-*{WoyH%hu34(HCaMu<30KS~H?cCL+Vn_#P zGE#vZik$N7Yc(x*!9EqlO*~2_RKnM#nopTwSZ=RC1GQHm!D>U|l`+@Dj&0i-;T}lF z1sg%FSVP^t&vSPK?j^Ls8nT%3e(ujC+wDe2Ev6q*UnXYncp&)na+#0(Z!w0{0M^5V zYF`(dZ}8?V$Zm5}y`I-TSa{k@-2T;1z5I2H>+L49 zyat%ED#hKUx)2?{r>t*Y1ekWEof?1J>rwRFvSoM9_&pf7Vg89%iK}pFN@EvZ^k1O3 zC%A+c`z#ADSrztdUK367{mBbw;+%-WlZ|>w{iV_~YG~7j^G9Em&f+Z(>f`$StIfo91Z(MaG5YSV6b|Y=nMLY>R7{Ul(p`W2{|*hrGH` zlk_3jUkjYfuJZC`vu-I=kdQI7W~Wrwl7$VC<{SM8T%mRM_}+EhR_g3KpJ*JjGeKXT zkZz+OsVDnwC%+fa!`U}Mf<;Z>fz>1KprGv>7S0ZlHnFlEQQbC?;tAx!6yS$mMBsh3 z9uQRIrCfU)Sk+W)o+c_xMg(kOEKX>f%tB95fF1tfGrw2k?>^d3-oOoIpI7cc$Cb$t zF?t9e&DArXH91ZBx40C(A@OHwDDJ+?zDriq_yeM9DK0#@z?n^Eyu2w+b5{dMveA!# z1S<+pQGevl2!woFBPO(T8ute6yHxQQnK@a$1eWxMl7!>L3n>8)7#1|hs-JcSn!$u!FbBEaMaT$Huov-Z;Z5bYs zcK)Fy(Lgw*2+6+?r{mwj&Pot-%DHEJUGj% z$Yh8@GwEHvmi8U?>I1{V4-f~CuY~m$z;mP-?7hV-uM5?2h$<=gH)TIH+HnH>;ZrgL ziA+U)Ui$;YVV&BPi6mU6M6+2BIAD7yXkdHl4h!&`)D?)^tMwg@vz~Vnq>O}+B3HJ! z!tG=5E>(lMD!Q;*^BC4RD}$7yQ0a-J)n&u}fKWg?S!fBfd>+IZTNGtAtm}Qu)d}So zHs?c$r#Rdkyd~xkc|Q8-<&NK4RRzHuia=^XejP-&$w5)*K55X;v=5_qPaL@k3~Of< zE@RfsbIp4sf~?!<$M{B8+a)snL7KoQ*0qT#%Y|bqKpY7Y&k9MWH2W5o{V{5cAYL*s ziTrprl9+(@rp{vRGHv z@vFQ*AePF5-}hgCeXnL=?x*UU1=0uNT{SDYFr8TZk&rG=-@z4kHgOm1Xr@Tpb?Q^J zvo(+maF+}#?B8)JJ@~vs?E{{d#nUnl;*G}Bi?aDw?5W)GB0eZe@IG(t?dqNmc>bR| z@$E78j6S9ii-4=YUjHV z-i@F+O%o~dT@GON$xI9Y7ba)c2sz5)@l~p5y%D1F->G!rU8B;G+OguS@xzZUWmgmB zosa^+_dX9?1N0KC4I^ouOC1vmoQSMHki! z**)Ndl18Y~Li&lO419V(V3t%{bp;Lvw4PAT$N4csfdb3E+|5|PE|?JEcv$9iJq|3c zT0~eH^-a_rgPRst+V% z2)RW~ZNGqB$qOm}Tv}yeo2poNP5Iz6}`>=iDQd%)D7CiS>CwVO?5pwl|u$w9hde?syz@FOqo377mmK2u`sr5cM zK4IV!(aor7yN?}*-r}CBi3_wr)#^b~?e7#O_}K^cBGIhy*yrX5JOW6<*=PT%9b$7E z*fpq8Ca2Vl&#6Or5kV72+-y>x;b`9%m}LZH}th-u3`45!hcb>aaQ{%4aCy++F zYfJ#R%+`9UK~a+4-hvIWyNLTj$x181vlT*0(M#b2$asz%&Qi^L*gz^uMtUO ze!VN_WSvy9?;{)u3u0=iRZYDv96`OYo}st1AAd!|I`G-I{nAOb@Avpsx@}AhZXd4? z0J%vIPLryqs_ltJThv6q<5P0US>=IahnEy$Wn)|X$a2pfAJ6-80jXmf-YtKq(??1d z*)JZq8&vx(Z|7wE6`^p2{I};1u5c|ihA3(!*M$ESQ=I;XuKT|#G5$w`*Z*$$`v0H& z|AzV(jm|&CI{z=d`1#FN%tQ19Q3VnKgz|vEyYgT4RR5GasYjliZZozD9C5nP20RK> z_?4#VtLL__?3JLN_P{?HS!r2?o6@p3Wn`X8LzLvDm850FrGdZF#=jgM{+9x-?$4bZ Y;Q!|WqFFP$KmnQunz|arcb~oaUzpHbrT_o{ literal 0 HcmV?d00001 diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 11bd26b0..471f041d 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -62,7 +62,7 @@ export const useAppStore = defineStore('app', { tagsViewIcon: true, // 是否显示标签图标 logo: true, // logo fixedHeader: true, // 固定toolheader - footer: true, // 显示页脚 + footer: false, // 显示页脚 greyMode: false, // 是否开始灰色模式,用于特殊悼念日 fixedMenu: wsCache.get('fixedMenu') || false, // 是否固定菜单 layout: wsCache.get(CACHE_KEY.LAYOUT) || 'classic', // layout布局 diff --git a/src/views/mapPage/realTimeMap/框选demo.vue b/src/views/mapPage/example/框选demo.vue similarity index 100% rename from src/views/mapPage/realTimeMap/框选demo.vue rename to src/views/mapPage/example/框选demo.vue diff --git a/src/views/mapPage/realTimeMap/测距.vue b/src/views/mapPage/example/测距demo.vue similarity index 100% rename from src/views/mapPage/realTimeMap/测距.vue rename to src/views/mapPage/example/测距demo.vue diff --git a/src/views/mapPage/example/第一版编辑地图.vue b/src/views/mapPage/example/第一版编辑地图.vue new file mode 100644 index 00000000..ce4f4f07 --- /dev/null +++ b/src/views/mapPage/example/第一版编辑地图.vue @@ -0,0 +1,1413 @@ + + + + + diff --git a/src/views/mapPage/realTimeMap/贝塞尔曲线demo.vue b/src/views/mapPage/example/贝塞尔曲线demo.vue similarity index 100% rename from src/views/mapPage/realTimeMap/贝塞尔曲线demo.vue rename to src/views/mapPage/example/贝塞尔曲线demo.vue diff --git a/src/views/mapPage/example/转换成实际坐标demo.vue b/src/views/mapPage/example/转换成实际坐标demo.vue new file mode 100644 index 00000000..cc418af3 --- /dev/null +++ b/src/views/mapPage/example/转换成实际坐标demo.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/views/mapPage/realTimeMap/editMap.vue b/src/views/mapPage/realTimeMap/editMap.vue index f22adc35..589ce004 100644 --- a/src/views/mapPage/realTimeMap/editMap.vue +++ b/src/views/mapPage/realTimeMap/editMap.vue @@ -115,24 +115,23 @@ -
+
-
resizeEnd(x, y, width, height, item, index)" @activated="() => activatedHandle(item, index)" @deactivated="deactivatedHandle" - :draggable="item.draggable" - :resizable="item.resizable" - :rotatable="item.rotatable" + :draggable="item.draggable && !state.prohibitedOperation" + :resizable="item.resizable && !state.prohibitedOperation" + :rotatable="item.rotatable && !state.prohibitedOperation" :lock-aspect-ratio="item.lockAspectRatio" style="border: none" > @@ -212,7 +211,7 @@ src="https://api.znkjfw.com/admin-api/infra/file/4/get/区域_png_179_1739327151876.png" alt="" :style="{ - width: item.locationWide + 'px', + width: item.locationWidee + 'px', height: item.locationDeep + 'px', border: currentItemIndex === index ? '1px dashed #000' : 'none' }" @@ -324,6 +323,7 @@ />
+ { currentItemIndex.value = index //节点编辑 - if (toolbarSwitchType.value === 'editNode' && item.type !== 7) { + if (toolbarSwitchType.value === 'editNode') { editNodePropertiesRef.value.open(JSON.parse(JSON.stringify(item))) } } @@ -476,7 +476,7 @@ const mapClick = (e) => { locationDeep: 16, locationWide: 16, angle: 0, - draggable: false, + draggable: true, resizable: false, rotatable: false, lockAspectRatio: false, //横纵比 @@ -737,7 +737,9 @@ const state = reactive({ inputBoxValue: '', //输入的值 isShowLayer: false, //图层显示 measureDistancesPoints: [], // 存储点击的点位 - measureDistancesNum: 0 // 存储两点之间的距离 + measureDistancesNum: 0, // 存储两点之间的距离 + imageChangeMultiple: 1, //图片放大缩小的倍数 + prohibitedOperation: false //禁止操作 在框选测距等操作时,禁止所有拖动等操作 }) const toolbarClick = (item) => { let type = item.switchType @@ -782,6 +784,17 @@ const toolbarClick = (item) => { state.measureDistancesNum = 0 // 清空存储两点之间的距离 } + //禁止操作 在框选测距等操作时,禁止所有拖动等操作 + if ( + toolbarSwitchType.value === 'ranging' || + toolbarSwitchType.value === 'lineLibrary' || + toolbarSwitchType.value === 'region' + ) { + state.prohibitedOperation = true + } else { + state.prohibitedOperation = false + } + switch (type) { case 'open': // 打开 @@ -903,18 +916,16 @@ const toolbarClick = (item) => { break case 'larger': //放大 - if (imgBgObj.width < 10000) { - imgBgObj.width *= 1.2 - imgBgObj.height *= 1.2 + if (state.imageChangeMultiple < 3) { + state.imageChangeMultiple *= 1.2 } else { message.warning('不能在放大了') } break case 'smaller': //缩小 - if (imgBgObj.width > 500) { - imgBgObj.width *= 0.8 - imgBgObj.height *= 0.8 + if (state.imageChangeMultiple > 0.3) { + state.imageChangeMultiple *= 0.8 } else { message.warning('不能在缩小了') } @@ -964,8 +975,8 @@ const startDrawSelection = (event) => { const backgroundRect = mapBackgroundRef.value.getBoundingClientRect() - const x = Number(event.clientX) - backgroundRect.left - const y = event.clientY - backgroundRect.top + const x = disposeEventPoints(event).x + const y = disposeEventPoints(event).y // 确保点击在背景区域内 if (x >= 0 && x <= backgroundRect.width && y >= 0 && y <= backgroundRect.height) { @@ -981,9 +992,8 @@ const startDrawSelection = (event) => { const updateDrawSelection = (event) => { if (toolbarSwitchType.value !== 'lineLibrary' && toolbarSwitchType.value !== 'region') return if (state.drawSelectionAreaShow) { - const backgroundRect = mapBackgroundRef.value.getBoundingClientRect() - const x = event.clientX - backgroundRect.left - const y = event.clientY - backgroundRect.top + const x = disposeEventPoints(event).x + const y = disposeEventPoints(event).y state.drawSelectionAreaBox.width = Number(x) - Number(state.drawSelectionStartPoint.x) state.drawSelectionAreaBox.height = Number(y) - Number(state.drawSelectionStartPoint.y) @@ -1112,33 +1122,26 @@ const computedLineWidth = computed(() => { // 处理点击事件 const measureDistancesClick = (event) => { // 获取点击点相对于整个页面的坐标 - const x = event.clientX - const y = event.clientY + + const x = disposeEventPoints(event).x + const y = disposeEventPoints(event).y // 检查点击是否发生在背景区域内 - const backgroundRect = mapBackgroundRef.value.getBoundingClientRect() - if ( - x >= backgroundRect.left && - x <= backgroundRect.right && - y >= backgroundRect.top && - y <= backgroundRect.bottom - ) { + if (state.measureDistancesPoints.length === 2) { + // 如果已经有两个点,清空信息 + state.measureDistancesPoints = [] + state.measureDistancesNum = null + } else { + // 记录点击的点位(相对于背景区域的坐标) + const offsetX = x + const offsetY = y + state.measureDistancesPoints.push({ x: offsetX, y: offsetY }) if (state.measureDistancesPoints.length === 2) { - // 如果已经有两个点,清空信息 - state.measureDistancesPoints = [] - state.measureDistancesNum = null - } else { - // 记录点击的点位(相对于背景区域的坐标) - const offsetX = x - backgroundRect.left - const offsetY = y - backgroundRect.top - state.measureDistancesPoints.push({ x: offsetX, y: offsetY }) - if (state.measureDistancesPoints.length === 2) { - // 计算两点之间的距离 - state.measureDistancesNum = calculateDistance( - state.measureDistancesPoints[0], - state.measureDistancesPoints[1] - ) - } + // 计算两点之间的距离 + state.measureDistancesNum = calculateDistance( + state.measureDistancesPoints[0], + state.measureDistancesPoints[1] + ) } } } @@ -1150,7 +1153,9 @@ const imgBgObj = reactive({ width: '', height: '', floor: '', - area: '' + area: '', + resolution: 0.05, + origin: [-54.4, -34.2] }) //接收参数 const { query } = useRoute() // 查询参数 @@ -1201,7 +1206,7 @@ const getAllNodeList = async () => { item.dataList = [] item.locationDeep = 16 item.locationWide = 16 - item.draggable = false + item.draggable = true item.resizable = false item.rotatable = false item.lockAspectRatio = true @@ -1211,7 +1216,7 @@ const getAllNodeList = async () => { item.locationDeep = item.dataList[0].locationDeep item.locationWide = item.dataList[0].locationWide item.draggable = true - item.resizable = false + item.resizable = true item.rotatable = false item.lockAspectRatio = true } else if (item.type === 3 || item.type === 4) { @@ -1220,7 +1225,7 @@ const getAllNodeList = async () => { item.locationDeep = item.dataObj.locationDeep item.locationWide = item.dataObj.locationWide item.draggable = true - item.resizable = false + item.resizable = true item.rotatable = false item.lockAspectRatio = true } else if (item.type === 7) { @@ -1285,33 +1290,50 @@ const layerSelectionSuccess = (typeList) => { }) } +//处理数据 +const disposeEventPoints = (event) => { + const rect = mapBackgroundRef.value.getBoundingClientRect() + const scrollLeft = mapBackgroundRef.value.scrollLeft // 水平滚动条偏移量 + const scrollTop = mapBackgroundRef.value.scrollTop // 垂直滚动条偏移量 + const devicePixelRatio = window.devicePixelRatio || 1 + + // 计算页面坐标(考虑设备像素比和滚动条偏移量) + const x = (event.clientX - rect.left + scrollLeft) / state.imageChangeMultiple / devicePixelRatio + const y = (event.clientY - rect.top + scrollTop) / state.imageChangeMultiple / devicePixelRatio + + // 转换为实际坐标 + const actualLocationX = (x - imgBgObj.origin[0]) / imgBgObj.resolution + const actualLocationY = (y - imgBgObj.origin[1]) / imgBgObj.resolution + + return { + x, + y, + actualLocationX, + actualLocationY + } +} + onMounted(() => { getMapList() }) diff --git a/src/views/mapPage/realTimeMap/test.vue b/src/views/mapPage/realTimeMap/test.vue index d569339f..0a029781 100644 --- a/src/views/mapPage/realTimeMap/test.vue +++ b/src/views/mapPage/realTimeMap/test.vue @@ -17,10 +17,7 @@
示例图片 - -
+ +
+ 距离:{{ distance.toFixed(2) }} 像素 +
- -
- - -
+ +
- - -
-